Как получить, какой фрагмент был выбран

Я создаю приложение табуляции, используя фрагменты.

Я успешно создал вкладки, но теперь мне нужно создать объект, когда выбран конкретный фрагмент. например Когда я выбираю SettingsTab, мне нужно вызвать функцию, определенную в Test class. и аналогичным образом уничтожить

// 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);

    }
}

Вот код в 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);


        }
    }

Ответ 1

В вашем ActionBar.TabListener вы можете сделать это - (я предполагаю, что вам нужно, чтобы объект находился в 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

Попробуйте это

    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();
        }
    }

Также вы можете изменить класс TabListener таким образом. Что касается меня, это лучший дизайн.

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);


    }
}

Ответ 3

Единственный официальный источник, который я нашел, был на сайте разработчика: http://developer.android.com/training/implementing-navigation/lateral.html

Они просто помещают аргументы для каждого созданного фрагмента и читают аргументы, когда фрагменты выбираются.

Ответ 4

По умолчанию, если вы выберете вкладку, она будет подсвечена. Если вы хотите выбрать "Явным образом", используйте данный комментированный код под вкладкой onTabSelected (TabLayout.Tab) с указанной вами индексной позицией табуляции. Этот код объяснит фрагмент изменения в выбранной позиции вкладки с помощью 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);
  }
 }
}