Android 如何获取已选择的片段

Android 如何获取已选择的片段,android,android-fragments,android-tabs,Android,Android Fragments,Android Tabs,我正在使用片段创建一个选项卡应用程序 我已经成功创建了选项卡,但现在我需要在选择特定片段时创建一个对象。e、 g.当我选择SettingsTab时,我需要调用测试类中定义的函数。同样的破坏 // SettingsTab package com.example.sensorspositioningn; import android.app.Fragment; import android.os.Bundle; import android.view.LayoutInflater; import

我正在使用片段创建一个选项卡应用程序

我已经成功创建了选项卡,但现在我需要在选择特定片段时创建一个对象。e、 g.当我选择
SettingsTab
时,我需要调用
测试类中定义的函数。同样的破坏

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


        }
    }
试试这个

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


    }
}

在您的
ActionBar.TabListener
中,您可以这样做-(我假设您需要对象位于
活动中


我在开发者网站上找到的唯一官方信息来源是:


他们只需为每个创建的片段放置参数,并在选择片段时读取参数。

默认情况下,如果选择选项卡,它将高亮显示。如果要显式选择,则意味着使用onTabSelected(TabLayout.Tab 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);
  }
 }
}
公共类GalleryFragment扩展片段实现TabLayout.OnTabSelectedListener
{
专用ViewPager ViewPager;公用ViewPagerAdapter适配器;专用表格布局;
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
视图根视图=充气机。充气(R.layout.fragment\u画廊,容器,假);
viewPager=(viewPager)rootView.findViewById(R.id.viewPager);
适配器=新的ViewPagerAdapter(getChildFragmentManager());
addFragment(新的PaymentCardFragment(),“支付卡”);
addFragment(新的忠诚卡片段(),“忠诚卡”);
viewPager.setAdapter(适配器);
tabLayout=(tabLayout)rootView.findviewbyd(R.id.tabs);
tabLayout.setupWithViewPager(viewPager);
tabLayout.setontAbsSelectedListener(此);
}
@凌驾
已选择的公共选项卡(TabLayout.Tab){
//当您选择选项卡或使用viewpager刷卡时,这将被称为第二个
final int position=tab.getPosition();
Log.i(“卡片”,“表格布局位置:+位置”);
//TabLayout.Tab tabdata=TabLayout.getTabAt(位置);
//tabdata.select();
tabLayout.post(新的Runnable(){
@凌驾
公开募捐{
如果(位置==0){
PaymentCardFragment PaymentCardFragment=getPaymentCardFragment();
如果(paymentCardFragment!=null){
VerticalViewpager vp=paymentCardFragment.mypager;
如果(vp!=null)
{
//vp.setCurrentItem(位置,真);
vp.setCurrentItem(vp.getAdapter().getCount()-1,true);
}
}
}
如果(位置==1){
LoyaltyCardFragment-LoyaltyCardFragment=getLoyaltyCardFragment();
if(忠诚CardFragment!=null){
VerticalViewpager vp=loyaltyCardFragment.mypager;
如果(vp!=null)
{
副总裁setCurrentItem(职位);
}
}
}
}
});
}
@凌驾
已选择的公共选项卡(TabLayout.Tab){
//当您选择选项卡或使用viewpager滑动时,这将被称为“第一”
}
@凌驾
已重新选择公共选项卡(TabLayout.Tab){
//仅当您选择已选择的选项卡时才会调用此选项(例如:反复选择第三个选项卡)
}
私人支付卡片段getLoyaltyCardFragment(){
片段f=adapter.mfFragmentList.get(viewPager.getCurrentItem());
if(f付款卡片段实例)
{
返回(PaymentCardFragment)f;
}
返回null;
}
私人忠诚CardFragment getPaymentCardFragment(){
片段f=adapter.mfFragmentList.get(viewPager.getCurrentItem());
if(f忠诚卡片段实例)
{
返回(忠诚卡碎片)f;
}
返回null;
}
类ViewPagerAdapter扩展了FragmentPagerAdapter{
public List mffragmentlist=new ArrayList();
私有最终列表MFFragmentTitleList=new ArrayList();
public void addFragment(片段片段,字符串标题){
添加(片段);
MFFragmentTitleList.add(标题);
}
}
}

请解释您的问题,清楚您想要什么?
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);
  }
 }
}