Autore Topic: Tab e swipe  (Letto 836 volte)

Offline vise950

  • Nuovo arrivato
  • *
  • Post: 32
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    nexus 4
  • Sistema operativo:
    winsows 8.1
Tab e swipe
« il: 05 Giugno 2014, 19:55:26 CEST »
0
ciao ragazzi...ho seguito un tutorial per creare un actionbar con tab usando lo swipe per passare da una tab all'altra

Codice (Java): [Seleziona]
public class MainActivity extends FragmentActivity implements ActionBar.TabListener {

    CollectionPagerAdapter mCollectionPagerAdapter;
    ViewPager mViewPager;
    ActionBar actionBar;

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

        mCollectionPagerAdapter = new CollectionPagerAdapter(getSupportFragmentManager());

        actionBar = getActionBar();
        actionBar.setHomeButtonEnabled(false);
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);


        mViewPager = (ViewPager) findViewById(R.id.pager);
        mViewPager.setAdapter(mCollectionPagerAdapter);
        mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
                    @Override
                    public void onPageSelected(int position) {
                        actionBar.setSelectedNavigationItem(position);
                    }
                });

        for (int i = 0; i < mCollectionPagerAdapter.getCount(); i++) {
            actionBar.addTab(actionBar.newTab()
                    .setText(mCollectionPagerAdapter.getPageTitle(i))
                    .setTabListener(this));
        }
    }

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

    public void onTabSelected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
        mViewPager.setCurrentItem(tab.getPosition());
    }

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


    //
    public class CollectionPagerAdapter extends FragmentPagerAdapter {

        final int NUM_ITEMS = 3; // numero di tab

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

        @Override
        public Fragment getItem(int i) {
            Fragment fragment = new TabFragment();
            Bundle args = new Bundle();
            args.putInt(TabFragment.ARG_OBJECT, i);
            fragment.setArguments(args);
            return fragment;
        }

        @Override
        public int getCount() {
            return NUM_ITEMS;
        }

        @Override
        public CharSequence getPageTitle(int position) {
            String tabLabel = null;
            switch (position) {
                case 0:
                    tabLabel = getString(R.string.label1);
                    break;
                case 1:
                    tabLabel = getString(R.string.label2);
                    break;
                case 2:
                    tabLabel = getString(R.string.label3);
                    break;
            }

            return tabLabel;
        }
    }


     //

    public static class TabFragment extends Fragment {

        public static final String ARG_OBJECT = "object";

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {

            Bundle args = getArguments();
            int position = args.getInt(ARG_OBJECT);

            int tabLayout = 0;
            switch (position) {
                case 0:
                    tabLayout = R.layout.tab1;
                    break;
                case 1:
                    tabLayout = R.layout.tab2;
                    break;
                case 2:
                    tabLayout = R.layout.tab3;
                    break;
            }

            View rootView = inflater.inflate(tabLayout, container, false);

            return rootView;
        }
    }
}


ho creato l'activity main e tre file .xml che rappresentano i fragment.
Poi ho creato una classe (tab1) dove ho messo un semplice toast quando premo un bottone ma non funzione nulla.
Da quello che ho visto l'activity main apre solo il layout del fragment e non il .class. Come devo fare per dirgli di aprire anche la classe corrispondende dove poi mettero il codice.
grazie per eventuali risposte

Offline CrotaNexus

  • Utente normale
  • ***
  • Post: 156
  • Vuolsi così colà dove si puote ciò che si vuole
  • Respect: +25
    • Google+
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    SimoneDev
  • Sistema operativo:
    Windows 8.1
Re:Tab e swipe
« Risposta #1 il: 06 Giugno 2014, 07:07:50 CEST »
0
Partendo dal presupposto che non ho ben capito cosa vuoi fare e quale è il problema posso suggerirti qualche mancanza che ho visto nel codice.
  • Il metodo getItem dell'Adapter serve per ritornare i vari Fragments che tu hai. Così come hai fatto tu tornerà sempre e solo TabFragment. Dovresti usare uno switch/case su "i", ossia la posizione, e in base a quella istanziare un nuovo Fragment, ritornandolo oppure facendo direttamente return new MioFragment() e mettendo alla fine return null;
  • Personalmente il metodo che usi in TabFragment non l'ho mai visto, tantomeno mai usato e non so nemmeno se si può fare percui ti consiglierei semplicemente di crearti x Fragment a seconda di quanti ne vuoi, "configurarli" nel metodo getItem dell'Adapter e per ciascuno di essi fare l'inflate e ritornare la rispettiva view.
SimoneDev @ Google Play Store

Offline vise950

  • Nuovo arrivato
  • *
  • Post: 32
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    nexus 4
  • Sistema operativo:
    winsows 8.1
Re:Tab e swipe
« Risposta #2 il: 06 Giugno 2014, 08:08:32 CEST »
0
Questo é l'altro modo....forse quello che dici tu

Codice (Java): [Seleziona]
public class TabActionBarActivity extends Activity {

    private ActionBar actionBar;
    private String label1,label2,label3;
    private Tab t1,t2,t3;
    private TabListener <?> tl1,tl2,tl3;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        actionBar = getActionBar();
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

        //TAB 1
        label1 = getResources().getString(R.string.label1);
        t1 = actionBar.newTab();
        t1.setText(label1);
        tl1 = new TabListener<Tab1Fragment>(this,label1,Tab1Fragment.class);
        t1.setTabListener(tl1);
        actionBar.addTab(t1);

        //TAB 2
        label2 = getResources().getString(R.string.label2);
        t2 = actionBar.newTab();
        t2.setText(label2);
        tl2 = new TabListener<Tab2Fragment>(this,label2,Tab2Fragment.class);
        t2.setTabListener(tl2);
        actionBar.addTab(t2);

        //TAB 3
        label3 = getResources().getString(R.string.label3);
        t3 = actionBar.newTab();
        t3.setText(label3);
        tl3 = new TabListener<Tab3Fragment>(this,label3,Tab3Fragment.class);
        t3.setTabListener(tl3);
        actionBar.addTab(t3);

    }

    //listener tab
    private class TabListener<T extends Fragment> implements ActionBar.TabListener {

        private Fragment mFragment;
        private final Activity mActivity;
        private final String mTag;
        private final Class<T> mClass;


        //activity: dove sono inizializzate le tab (this)
        //tag: nome del tab (label1,label2,...)
        //clz:.class che fa riferimento al fragment (Tab1Fragment,...)
        public TabListener(Activity activity, String tag, Class<T> clz) {
            mActivity = activity;
            mTag = tag;
            mClass = clz;
        }

        public void onTabSelected(Tab tab, FragmentTransaction ft) {
            // Check if the fragment is already initialized
            if (mFragment == null) {
                // If not, instantiate and add it to the activity
                mFragment = Fragment.instantiate(mActivity, mClass.getName());
                ft.add(android.R.id.content, mFragment, mTag);
            } else {
                // If it exists, simply attach it in order to show it
                ft.attach(mFragment);
            }
        }

        public void onTabUnselected(Tab tab, FragmentTransaction ft) {
            if (mFragment != null) {
                // Detach the fragment, because another one is being attached
                ft.detach(mFragment);
            }
        }

        public void onTabReselected(Tab tab, FragmentTransaction ft) {
            // User selected the already selected tab. Usually do nothing.
        }
    }

}


Questo é il fragment (per ora sono tutti uguali)

Codice (Java): [Seleziona]
public class Tab1Fragment extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        return (LinearLayout) inflater.inflate(R.layout.tab1, container, false);
    }

}

Peró non so come implementare lo swipe

Inviato dal mio Nexus 4 utilizzando Tapatalk
« Ultima modifica: 06 Giugno 2014, 08:10:40 CEST da vise950 »

Offline vise950

  • Nuovo arrivato
  • *
  • Post: 32
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    nexus 4
  • Sistema operativo:
    winsows 8.1
Re:Tab e swipe
« Risposta #3 il: 06 Giugno 2014, 08:09:36 CEST »
0
A
« Ultima modifica: 06 Giugno 2014, 08:12:11 CEST da vise950 »

Offline CrotaNexus

  • Utente normale
  • ***
  • Post: 156
  • Vuolsi così colà dove si puote ciò che si vuole
  • Respect: +25
    • Google+
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    SimoneDev
  • Sistema operativo:
    Windows 8.1
Re:Tab e swipe
« Risposta #4 il: 06 Giugno 2014, 08:48:36 CEST »
+1
Si può fare tutto molto più semplicemente. Ti posto un codice che uso io nella mia applicazione per lo swipe
Codice (Java): [Seleziona]
viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
             
            @Override
            public void onPageSelected(int posizione) {
                // TODO Auto-generated method stub        
                actionBar.setSelectedNavigationItem(posizione);
            }
 
            @Override
            public void onPageScrolled(int arg0, float arg1, int arg2) {
                // TODO Auto-generated method stub            
            }
 
            @Override
            public void onPageScrollStateChanged(int arg0) {
                // TODO Auto-generated method stub            
            }
        });

Per il click sulle Tab dell'ActionBar

Codice (Java): [Seleziona]
ActionBar.TabListener listener = new ActionBar.TabListener() {
       
        @Override
        public void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft) {
            // TODO Auto-generated method stub            
            viewPager.setCurrentItem(tab.getPosition());
        }

        @Override
        public void onTabUnselected(Tab tab, FragmentTransaction ft) {
            // TODO Auto-generated method stub            
        }

        @Override
        public void onTabReselected(Tab tab, FragmentTransaction ft) {
            // TODO Auto-generated method stub        
        }
    };    

Per aggiungere una Tab

Codice (Java): [Seleziona]
        actionBar.addTab(actionBar.newTab().setText(getString(R.string.tuaStringa)).setTabListener(listener));
Per il ritorno della View nei Fragments
Codice (Java): [Seleziona]
        view = inflater.inflate(R.layout.tuoLayout, null);
        return view;
SimoneDev @ Google Play Store

Offline vise950

  • Nuovo arrivato
  • *
  • Post: 32
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    nexus 4
  • Sistema operativo:
    winsows 8.1
Re:Tab e swipe
« Risposta #5 il: 06 Giugno 2014, 17:02:03 CEST »
0
grazie ho fatto come detto da te

Codice (Java): [Seleziona]
public class MainActivity extends Activity{

    ViewPager mViewPager;
    ActionBar actionBar;

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

        actionBar = getActionBar();
        actionBar.setHomeButtonEnabled(false);
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

        //tab1
        actionBar.addTab(actionBar.newTab().
                setText(getString(R.string.label1)).setTabListener(listener));

        //tab2
        actionBar.addTab(actionBar.newTab().
                setText(getString(R.string.label2)).setTabListener(listener));


        //gestore swipe
        mViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {

            @Override
            public void onPageSelected(int posizione) {
                // TODO Auto-generated method stub
                actionBar.setSelectedNavigationItem(posizione);
            }

            @Override
            public void onPageScrolled(int arg0, float arg1, int arg2) {
                // TODO Auto-generated method stub
            }

            @Override
            public void onPageScrollStateChanged(int arg0) {
                // TODO Auto-generated method stub
            }
        });
    }

    //gestore tab su actionBar
    ActionBar.TabListener listener = new ActionBar.TabListener() {

        @Override
        public void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft) {
            // TODO Auto-generated method stub
            mViewPager.setCurrentItem(tab.getPosition());
        }

        @Override
        public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction ft) {
            // TODO Auto-generated method stub
        }

        @Override
        public void onTabReselected(ActionBar.Tab tab, FragmentTransaction ft) {
            // TODO Auto-generated method stub
        }
    };

ma non va nulla....magari ho sbagliato qualcosa

Offline CrotaNexus

  • Utente normale
  • ***
  • Post: 156
  • Vuolsi così colà dove si puote ciò che si vuole
  • Respect: +25
    • Google+
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    SimoneDev
  • Sistema operativo:
    Windows 8.1
Re:Tab e swipe
« Risposta #6 il: 06 Giugno 2014, 18:49:34 CEST »
0
Cosa significa "non va nulla"? Sii più preciso perfavore altrimenti è difficile venirci incontro. :)

Inviato dal mio Galaxy Nexus con Tapatalk 2

SimoneDev @ Google Play Store

Offline vise950

  • Nuovo arrivato
  • *
  • Post: 32
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    nexus 4
  • Sistema operativo:
    winsows 8.1
Re:Tab e swipe
« Risposta #7 il: 07 Giugno 2014, 15:54:36 CEST »
0
scusa per le poche informazioni...comunque ho trovato un bel modo e semplice per farlo solo che quando ho cominciato scrivere sono saltati fuori molti errori stani
ad esempio non riconosce il ViewPager o l'extends
non so a cosa sia dovuto




EDIT: ho risolto creando un nuovo progetto
Ora però ho altri problemi (credo banali) quando uso il findViewById(...) viene evidenziato di rosso con l'avviso Cannot resolve method. è la prima volta che mi capitano queste cose strane
Se può essere d'aiuto uso AndroidStudio 0.6.0

Se volete vi lascio il codice funzionate

Post unito: 07 Giugno 2014, 22:48:10 CEST
Ringarzio @CrotaNexus di tutto...sono riuscito a risolvere ed ora credo di riuscire a procedere da solo
Lascio il codice a chi servisse

ActivityMain
Codice (Java): [Seleziona]
public class MainActivity extends FragmentActivity implements ActionBar.TabListener {

    ViewPager mViewPager;
    ActionBar actionBar;

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

        mViewPager = (ViewPager) findViewById(R.id.pager);
        mViewPager.setAdapter(new MyAdapter(getFragmentManager()));
        mViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageSelected(int arg0) {
                actionBar.setSelectedNavigationItem(arg0);
            }

            @Override
            public void onPageScrolled(int arg0, float arg1, int arg2) {
            }

            @Override
            public void onPageScrollStateChanged(int arg0) {
            }
        });

        actionBar = getActionBar();
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

        //TAB 1
        ActionBar.Tab tab1 = actionBar.newTab();
        tab1.setText("TAB 1");
        tab1.setTabListener(this);

        //TAB 2
        ActionBar.Tab tab2 = actionBar.newTab();
        tab2.setText("TAB 2");
        tab2.setTabListener(this);

        //TAB 3
        ActionBar.Tab tab3 = actionBar.newTab();
        tab3.setText("TAB 3");
        tab3.setTabListener(this);

        actionBar.addTab(tab1);
        actionBar.addTab(tab2);
        actionBar.addTab(tab3);
    }


    @Override
    public void onTabSelected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
        mViewPager.setCurrentItem(tab.getPosition());
    }

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

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


    public class MyAdapter extends FragmentPagerAdapter {

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

        @Override
        public Fragment getItem(int position) {

            Fragment fragment = null;

            //apro il fragment in base alla posizione
           /* if (position == 0) {
                fragment = new FragmentA();
            }
            if (position == 1) {
                fragment = new FragmentB();
            }
            if (position == 2) {
                fragment = new FragmentC();
            }
            return fragment;*/


            //apro il fragment in base alla posizione
            switch (position){
                case 0:
                    fragment=new FragmentA();
                    break;
                case 1:
                    fragment=new FragmentB();
                    break;
                case 2:
                    fragment=new FragmentC();
                    break;
            }
            return fragment;
        }

        @Override
        public int getCount() {
            return 3;
        }
    }
}

FragmentA (sono tutti 3 uguali e ognuno puo fare quello che vuole)
Codice (Java): [Seleziona]
public class FragmentA extends android.app.Fragment {

    Button button;

    public FragmentA() {}

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
  }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedIstanceState) {
        View view= inflater.inflate(R.layout.fragment_a, container, false);

        button=(Button)view.findViewById(R.id.button1);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Toast.makeText(getActivity(),"Bottone premuto",Toast.LENGTH_SHORT).show();
            }
        });

        return view;
    }
}
« Ultima modifica: 08 Giugno 2014, 08:33:48 CEST da vise950, Reason: Merged DoublePost »