Autore Topic: Ignoranza sui Fragment  (Letto 736 volte)

Offline Maxton

  • Nuovo arrivato
  • *
  • Post: 3
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy s2
  • Sistema operativo:
    Cyano
Ignoranza sui Fragment
« il: 08 Agosto 2013, 09:38:11 CEST »
0
Salve a tutti, sono un nabbo che cerca di creare la sua prima applicazione.
Ho dei seri problemi con i fragment, so che esistoni dei tutorial sia su questo sito che in internet ma non riesco proprio a comprenderli, sono 4 giorni che ci sto provando ma inutilmente. Vi illustro il mio problema.

Codice (Java): [Seleziona]
package com.example.applicazione;

import java.util.Locale;
import android.app.ActionBar;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.app.NavUtils;
import android.support.v4.view.ViewPager;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

public class MainActivity extends FragmentActivity implements ActionBar.TabListener
{

        /**
         * The {@link android.support.v4.view.PagerAdapter} that will provide
         * fragments for each of the sections. We use a
         * {@link android.support.v4.app.FragmentPagerAdapter} derivative, which
         * will keep every loaded fragment in memory. If this becomes too memory
         * intensive, it may be best to switch to a
         * {@link android.support.v4.app.FragmentStatePagerAdapter}.
         */

        SectionsPagerAdapter mSectionsPagerAdapter;

        /**
         * The {@link ViewPager} that will host the section contents.
         */

        ViewPager mViewPager;

        @Override
        protected void onCreate(Bundle savedInstanceState)
        {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);

                // Set up the action bar.
                final ActionBar actionBar = getActionBar();
                actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

                // Create the adapter that will return a fragment for each of the three
                // primary sections of the app.
                mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());

                // Set up the ViewPager with the sections adapter.
                mViewPager = (ViewPager) findViewById(R.id.pager);
                mViewPager.setAdapter(mSectionsPagerAdapter);

                // When swiping between different sections, select the corresponding
                // tab. We can also use ActionBar.Tab#select() to do this if we have
                // a reference to the Tab.
                mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener()
                                {
                                        @Override
                                        public void onPageSelected(int position)
                                        {
                                                actionBar.setSelectedNavigationItem(position);
                                        }
                                });

                // For each of the sections in the app, add a tab to the action bar.
                for (int i = 0; i < mSectionsPagerAdapter.getCount(); i++)
                {
                        // Create a tab with text corresponding to the page title defined by
                        // the adapter. Also specify this Activity object, which implements
                        // the TabListener interface, as the callback (listener) for when
                        // this tab is selected.
                        actionBar.addTab(actionBar.newTab().setText(mSectionsPagerAdapter.getPageTitle(i)).setTabListener(this));
                }
        }

        @Override
        public boolean onCreateOptionsMenu(Menu menu)
        {
                // Inflate the menu; this adds items to the action bar if it is present.
                getMenuInflater().inflate(R.menu.main, menu);
                return true;
        }

        @Override
        public void onTabSelected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction)
        {
                // When the given tab is selected, switch to the corresponding page in
                // the ViewPager.
                mViewPager.setCurrentItem(tab.getPosition());
        }

        @Override
        public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction)
        {
               
        }

        @Override
        public void onTabReselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction)
        {
               
        }

        /**
         * A {@link FragmentPagerAdapter} that returns a fragment corresponding to
         * one of the sections/tabs/pages.
         */

        public class SectionsPagerAdapter extends FragmentPagerAdapter
        {

                public SectionsPagerAdapter(FragmentManager fm)
                {
                        super(fm);
                }

                @Override
                public Fragment getItem(int position)
                {
                        // getItem is called to instantiate the fragment for the given page.
                        // Return a DummySectionFragment (defined as a static inner class
                        // below) with the page number as its lone argument.
                        Fragment fragment = new DummySectionFragment();
                        Bundle args = new Bundle();
                        args.putInt(DummySectionFragment.ARG_SECTION_NUMBER, position + 1);
                        fragment.setArguments(args);
                        return fragment;
                }

                @Override
                public int getCount()
                {
                        // Show 4 total pages.
                        return 4;
                }

                @Override
                public CharSequence getPageTitle(int position)
                {
                        Locale l = Locale.getDefault();
                        switch (position)
                        {
                                case 0:
                                        return getString(R.string.title_section1).toUpperCase(l);
                                case 1:
                                        return getString(R.string.title_section2).toUpperCase(l);
                                case 2:
                                        return getString(R.string.title_section3).toUpperCase(l);
                                case 3:
                                        return getString(R.string.title_section4).toUpperCase(l);
                        }
                        return null;
                }
        }

        /**
         * A dummy fragment representing a section of the app, but that simply
         * displays dummy text.
         */

        public static class DummySectionFragment extends Fragment
        {
                /**
                 * The fragment argument representing the section number for this
                 * fragment.
                 */

                public static final String ARG_SECTION_NUMBER = "section_number";

                public DummySectionFragment()
                {
                       
                }

                @Override
                public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                Bundle savedInstanceState)
                {
                        View rootView = inflater.inflate(R.layout.fragment_main_dummy, container, false);
                        TextView dummyTextView = (TextView) rootView.findViewById(R.id.section_label);
                        dummyTextView.setText(Integer.toString(getArguments().getInt(ARG_SECTION_NUMBER)));
                        return rootView;
                }
        }

}

Questo è il codice autogenerato da eclipse per una applicazione "Blank Activity" con "Fixed Tabs + Swipe", ho solamente aggiunto un tab, quello che con capisco è come faccio a creare una pagina (fragment) e non so come fare per far comparire la pagina per ogni volta che viene selezionato un tab. So che è un problema da babbani, ma non so più cos'altro fare. Grazie in anticipo per la pazienza.
Per precisazioni, utilizzo l'ultimo SDK con android 4.2 jelly bean e conosco il linguaggio java, infatti la logica dell'applicazione per ora è in un'altra cartella.
« Ultima modifica: 08 Agosto 2013, 10:36:59 CEST da Maxton »

Offline GabMarioPower

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 606
  • Respect: +152
    • Github
    • Google+
    • gabrielemariotti
    • GabMarioPower
    • Mostra profilo
  • Play Store ID:
    GAB+MARIO+DEV
  • Sistema operativo:
    Ubuntu 14.04 , Win 10
Re:Ignoranza sui Fragment
« Risposta #1 il: 09 Agosto 2013, 15:29:10 CEST »
0
La risposta nella tua domanda è nel SectionsPagerAdapter.

Codice (Java): [Seleziona]
public class SectionsPagerAdapter extends FragmentPagerAdapter
        {

                public SectionsPagerAdapter(FragmentManager fm)
                {
                        super(fm);
                }

                @Override
                public Fragment getItem(int position)
                {
                        // getItem is called to instantiate the fragment for the given page.
                        // Return a DummySectionFragment (defined as a static inner class
                        // below) with the page number as its lone argument.
                        Fragment fragment = new DummySectionFragment();
                        Bundle args = new Bundle();
                        args.putInt(DummySectionFragment.ARG_SECTION_NUMBER, position + 1);
                        fragment.setArguments(args);
                        return fragment;
                }

E' il metodo getItem che restituisce il Fragment in base al valore di position.
Qualcosa del genere.

Codice (Java): [Seleziona]
                @Override
                public Fragment getItem(int position) {
                        switch (position) {
                        case 0:
                                return mFragment0= new MyFragment0();
                        case 1:
                                return mFragment1= new MyFragment1();
                        case 2:
                                return mFragment2= new MyFragment2();
                        case 3:
                                return mFragment3= new MyFragment3();
                        }
                        return null;
                }

In generale l'argomento Fragment non è banalissimo, ma è basilare. Sicuramente non è una pagina.... in una Activity puoi avere più fragment.

I link che ti consiglio sono quelli ufficiali:
Fragments | Android Developers
Building a Dynamic UI with Fragments | Android Developers

E nel caso specifico del viewPager
Creating Swipe Views with Tabs | Android Developers

Offline Maxton

  • Nuovo arrivato
  • *
  • Post: 3
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy s2
  • Sistema operativo:
    Cyano
Re:Ignoranza sui Fragment
« Risposta #2 il: 08 Ottobre 2013, 10:19:43 CEST »
0
Grazie mille, gentilissimo e chiarissimo..  :-)

Offline Nicola_D

  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:Ignoranza sui Fragment
« Risposta #3 il: 08 Ottobre 2013, 11:14:59 CEST »
0
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia