2013-06-20 9 views
10

Sto creando un'applicazione di tabulazione, usando i frammenti.Come ottenere quale frammento è stato selezionato

Ho creato schede con successo, ma ora ho bisogno di creare un oggetto quando viene selezionato un frammento specifico. per esempio. Quando seleziono SettingsTab ho bisogno di chiamare una funzione che è definita in Test class. e allo stesso modo distruggere

// SettingsTab 
package com.example.sensorspositioningn; 

import android.app.Fragment; 
import android.os.Bundle; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 

public class SettingsTab extends Fragment { 

    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     // Inflate the layout for this fragment 
     return inflater.inflate(R.layout.settingstab, container, false); 

    } 
} 

Ecco il codice in mainActivity:

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


     appContext = getApplicationContext(); 

     //ActionBar 
     ActionBar actionbar = getActionBar(); 
     actionbar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 

     ActionBar.Tab Tab1= actionbar.newTab().setText("Tab1"); 
     ActionBar.Tab Tab2= actionbar.newTab().setText("Tab2"); 
     ActionBar.Tab Tab3= actionbar.newTab().setText("Tab3"); 
     ActionBar.Tab SettingsTab = actionbar.newTab().setText("Settings"); 

     Fragment Tab1F= new Tab1(); 
     Fragment Tab2F= new Tab2(); 
     Fragment Tab3F= new Tab3(); 
     Fragment mSettingsFragment = new SettingsTab(); 

     Tab1.setTabListener(new MyTabsListener(Tab1F)); 
     Tab1.setTabListener(new MyTabsListener(Tab2F)); 
     Tab1.setTabListener(new MyTabsListener(Tab3F)); 
     SettingsTab.setTabListener(new MyTabsListener(mSettingsFragment)); 

     actionbar.addTab(Tab1); 
     actionbar.addTab(Tab2); 
     actionbar.addTab(Tab3); 
     actionbar.addTab(SettingsTab); 


    } 
protected void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 
     outState.putInt("tab", getActionBar().getSelectedNavigationIndex()); 
    } 

class MyTabsListener implements ActionBar.TabListener { 
     public Fragment fragment; 

     public MyTabsListener(Fragment fragment) { 
      this.fragment = fragment; 
     } 


     public void onTabReselected(Tab tab, FragmentTransaction ft) { 
      Toast.makeText(MainActivity.appContext, "Reselected!", Toast.LENGTH_LONG).show(); 
     } 


     public void onTabSelected(Tab tab, FragmentTransaction ft) { 
      ft.replace(R.id.fragment_container, fragment); 




     } 


     public void onTabUnselected(Tab tab, FragmentTransaction ft) { 
      ft.remove(fragment); 


     } 
    } 
+0

Spiega la tua domanda, chiaramente cosa volevi? –

risposta

7

Nel vostro ActionBar.TabListener si può fare questo - (sto supponendo che è necessario l'oggetto di essere nel Activity)

class MyTabsListener implements ActionBar.TabListener { 
    public Fragment fragment; 

    public MyTabsListener(Fragment fragment) { 
     this.fragment = fragment; 
    } 


    public void onTabReselected(Tab tab, FragmentTransaction ft) { 
     Toast.makeText(MainActivity.appContext, "Reselected!", Toast.LENGTH_LONG).show(); 
    } 


    public void onTabSelected(Tab tab, FragmentTransaction ft) { 
     ft.replace(R.id.fragment_container, fragment); 

     if(fragment instanceof SettingsTab) { 
      // Create your object, call your function 
     } 
    } 


    public void onTabUnselected(Tab tab, FragmentTransaction ft) { 
     ft.remove(fragment); 

     if(fragment instanceof SettingsTab) { 
      // Destroy your object 
     } 
    } 
} 
2

Prova questa

public void onTabSelected(Tab tab, FragmentTransaction ft) { 
     ft.replace(R.id.fragment_container, fragment); 

     if(fragment instanceof SettingsTab){ 
      doSettingsMethod(); 
     } 

     if(fragment instanceof Tab1){ 
      doOtherMethod1(); 
     } 

     if(fragment instanceof Tab2){ 
      doOtherMethod2(); 
     } 

     if(fragment instanceof Tab3){ 
      doOtherMethod3(); 
     } 
    } 

Inoltre si può variare la classe TabListener in questo modo. Per quanto mi riguarda è un design migliore.

class MyTabsListener implements ActionBar.TabListener { 
    public Fragment fragment; 
    private final Runnable onSelect; 

    public MyTabsListener(Fragment fragment) { 
     this.fragment = fragment; 
     this.onSelect = null; 
    } 

    public MyTabsListener(Fragment fragment, Runnable onSelect) { 
     this.fragment = fragment; 
     this.onSelect = onSelect; 
    } 


    public void onTabReselected(Tab tab, FragmentTransaction ft) { 
     Toast.makeText(MainActivity.appContext, "Reselected!", Toast.LENGTH_LONG).show(); 
    } 


    public void onTabSelected(Tab tab, FragmentTransaction ft) { 
     ft.replace(R.id.fragment_container, fragment); 
     if(onSelect != null){ 
      fragment.getActivity().runOnUiThread(onSelect); 
     } 
    } 


    public void onTabUnselected(Tab tab, FragmentTransaction ft) { 
     ft.remove(fragment); 


    } 
} 
0

Per impostazione predefinita se si seleziona una scheda verrà evidenziato. Se si desidera selezionare esplicitamente, utilizzare il codice commentato specificato nella scheda suTabSelected (TabLayout.Tab) con la posizione dell'indice di tabulazione specificata. Questo codice spiegherà il frammento di cambiamento sulla posizione selezionata della scheda usando viewpager.

public class GalleryFragment extends Fragment implements TabLayout.OnTabSelectedListener 
{ 
private ViewPager viewPager;public ViewPagerAdapter adapter;private TabLayout tabLayout; 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
View rootView = inflater.inflate(R.layout.fragment_gallery, container, false); 
viewPager = (ViewPager) rootView.findViewById(R.id.viewpager); 
adapter = new ViewPagerAdapter(getChildFragmentManager()); 
adapter.addFragment(new PaymentCardFragment(), "PAYMENT CARDS"); 
adapter.addFragment(new LoyaltyCardFragment(), "LOYALTY CARDS"); 
viewPager.setAdapter(adapter); 
tabLayout = (TabLayout) rootView.findViewById(R.id.tabs); 
    tabLayout.setupWithViewPager(viewPager); 
    tabLayout.setOnTabSelectedListener(this); 
} 

@Override 
public void onTabSelected(TabLayout.Tab tab) { 
    //This will be called 2nd when you select a tab or swipe using viewpager 
    final int position = tab.getPosition(); 
    Log.i("card", "Tablayout pos: " + position); 
    //TabLayout.Tab tabdata=tabLayout.getTabAt(position); 
    //tabdata.select(); 
    tabLayout.post(new Runnable() { 
     @Override 
     public void run() { 
      if (position == 0) { 
       PaymentCardFragment paymentCardFragment = getPaymentCardFragment(); 
       if (paymentCardFragment != null) { 
        VerticalViewpager vp = paymentCardFragment.mypager; 
        if(vp!=null) 
        { 
         //vp.setCurrentItem(position,true); 
         vp.setCurrentItem(vp.getAdapter().getCount()-1,true); 
        } 
        } 
      } 
      if (position == 1) { 
       LoyaltyCardFragment loyaltyCardFragment = getLoyaltyCardFragment(); 
       if (loyaltyCardFragment != null) { 
        VerticalViewpager vp = loyaltyCardFragment.mypager; 
        if(vp!=null) 
        { 
         vp.setCurrentItem(position); 
        } 
        } 
      } 
     } 
    }); 
} 

@Override 
public void onTabUnselected(TabLayout.Tab tab) { 
//This will be called 1st when you select a tab or swipe using viewpager 
} 
@Override 
public void onTabReselected(TabLayout.Tab tab) { 
    //This will be called only when you select the already selected tab(Ex: selecting 3rd tab again and again) 
} 
private PaymentCardFragment getLoyaltyCardFragment() { 
    Fragment f = adapter.mFragmentList.get(viewPager.getCurrentItem()); 

    if(f instanceof PaymentCardFragment) 
    { 
    return (PaymentCardFragment) f; 
    } 
    return null; 
} 
private LoyaltyCardFragment getPaymentCardFragment() { 
    Fragment f = adapter.mFragmentList.get(viewPager.getCurrentItem()); 
    if(f instanceof LoyaltyCardFragment) 
    { 
    return (LoyaltyCardFragment) f; 
    } 
    return null; 
} 
    class ViewPagerAdapter extends FragmentPagerAdapter { 
    public List<Fragment> mFragmentList = new ArrayList<>(); 
    private final List<String> mFragmentTitleList = new ArrayList<>(); 
    public void addFragment(Fragment fragment, String title) { 
    mFragmentList.add(fragment); 
    mFragmentTitleList.add(title); 
    } 
} 
} 
Problemi correlati