【问题标题】:Not getting current selected Tab position in android tablayout没有在android tablayout中获取当前选定的Tab位置
【发布时间】:2018-02-26 07:27:42
【问题描述】:

我正在创建一个基于选项卡的应用程序,用户可以通过单击一个按钮来创建选项卡,并可以通过单击另一个按钮来删除选项卡。我使用 Tab 布局、Fragments 和 Viewpager 实现了这一点。

当函数 setuptablyout 函数创建新选项卡时,我能够获取当前选项卡位置。但是当我单击另一个选项卡时,即移动到其他选项卡时,我无法敬酒。

我发现使用tabLayout.addOnTabSelectedListener 可以获得位置,而这在此处不起作用。

我的活动代码是:

public class MainActivity extends AppCompatActivity{
    TextView textView;
    private TabLayout tabLayout;
    public static ViewPager viewPager;
    public static ViewPagerAdapter adapter;
    private ImageView add;
    int selectedTabPosition;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        viewPager = (ViewPager)findViewById(R.id.my_viewpager);
        tabLayout = (TabLayout) findViewById(R.id.my_tab_layout);
        add= (ImageView) findViewById(R.id.imageButtonAdd1);
        adapter = new ViewPagerAdapter(getSupportFragmentManager(), MainActivity.this, viewPager, tabLayout);
        viewPager.setAdapter(adapter);
        createFirstFragment("POS "+adapter.getCount());
        tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
            @Override
            public void onTabSelected(TabLayout.Tab tab) {
                Toast.makeText(getApplicationContext(),"Pos onTabSelected: "+ tabLayout.getSelectedTabPosition(),Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onTabUnselected(TabLayout.Tab tab) {
            }

            @Override
            public void onTabReselected(TabLayout.Tab tab) {
            }
        });
        add.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(adapter.getCount() > 4){
                    Toast.makeText(MainActivity.this, "Only 5 Tabs allowed", Toast.LENGTH_SHORT).show();
                }
                else {
                    Bundle bundle = new Bundle();
                    bundle.putString("data", "POS "+adapter.getCount());
                    FragmentChild fragmentChild = new FragmentChild();
                    fragmentChild.setArguments(bundle);
                    adapter.addFrag(fragmentChild, "POS "+adapter.getCount());
                    adapter.notifyDataSetChanged();
                    if (adapter.getCount() > 0) tabLayout.setupWithViewPager(viewPager);
                    Log.e("adapter.getCount()",String.valueOf(adapter.getCount()));
                    viewPager.setCurrentItem(adapter.getCount() - 1);
                    setupTabLayout();
                }
            }
        });
    }

    public void createFirstFragment(String pagename) {
        Bundle bundle = new Bundle();
        bundle.putString("data", pagename);
        FragmentChild fragmentChild = new FragmentChild();
        fragmentChild.setArguments(bundle);
        adapter.addFrag(fragmentChild, pagename);
        adapter.notifyDataSetChanged();
        if (adapter.getCount() > 0) tabLayout.setupWithViewPager(viewPager);
        Log.e("adapter.getCount()",String.valueOf(adapter.getCount()));
        viewPager.setCurrentItem(adapter.getCount() - 1);
        setupTabLayout();
    }

    public void setupTabLayout() {
        selectedTabPosition = viewPager.getCurrentItem();
        Toast.makeText(MainActivity.this, "selectedTabPosition --> "+selectedTabPosition, Toast.LENGTH_SHORT).show();
        for (int i = 0; i < tabLayout.getTabCount(); i++) {
            tabLayout.getTabAt(i).setCustomView(adapter.getTabView(i));
        }
    }

}

ViewPager 类:

public class ViewPagerAdapter extends FragmentPagerAdapter {
    private final ArrayList<Fragment> mFragmentList = new ArrayList<>();
    private final ArrayList<String> mFragmentTitleList = new ArrayList<>();
    Context context;
    ViewPager viewPager;
    TabLayout tabLayout;
    int selectedTabPosition;
    PreferenceHelper prefs;
    private Map<Integer, String> mFragmentTags;
    private FragmentManager mFragmentManager;
    private boolean doNotifyDataSetChangedOnce = false;
    public ViewPagerAdapter(FragmentManager manager, Context context, ViewPager viewPager,
                            TabLayout tabLayout) {
        super(manager);
        this.context = context;
        this.viewPager = viewPager;
        this.tabLayout = tabLayout;
        mFragmentTags = new HashMap<Integer, String>();
        prefs = new PreferenceHelper(context);
    }

    @Override
    public Fragment getItem(int position) {
        return mFragmentList.get(position);
    }

    @Override
    public int getCount() {
        if (doNotifyDataSetChangedOnce) {
            doNotifyDataSetChangedOnce = false;
            notifyDataSetChanged();
        }
        return mFragmentList.size();
    }

    public void addFrag(Fragment fragment, String title) {
        mFragmentList.add(fragment);
        mFragmentTitleList.add(title);
    }

    public void removeFrag(int position) {
        removeTab(position);
        Fragment fragment = mFragmentList.get(position);
        mFragmentList.remove(fragment);
        mFragmentTitleList.remove(position);
        //destroyFragmentView(viewPager, position, fragment);
        notifyDataSetChanged();
        Log.e("getCount()", String.valueOf(getCount()));
        if (getCount() > 0)
            tabLayout.setupWithViewPager(viewPager);
        setupTabLayout();
    }

    public View getTabView(final int position) {
        View view = LayoutInflater.from(context).inflate(R.layout.custom_tab_item, null);
        TextView tabItemName = (TextView) view.findViewById(R.id.textViewTabItemName);
        ImageView tabItemAvatar =
            (ImageView) view.findViewById(R.id.imageViewTabItemAvatar);
        ImageButton remove = (ImageButton) view.findViewById(R.id.imageButtonRemove);
        if(getCount() == 1){
            remove.setVisibility(View.INVISIBLE);
        }
        else{
            remove.setVisibility(View.VISIBLE);
        }
        remove.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                    Log.d("Remove", "Remove");
                    if(getCount() != 1){
                        removeFrag(position);
                    }
                    else{
                       // Toast.makeText("Atleast One Tab is requied")
                    }

            }
        });
        tabItemName.setText(mFragmentTitleList.get(position));
        tabItemName.setTextColor(context.getResources().getColor(android.R.color.background_light));
        tabItemAvatar.setImageResource(R.drawable.boy);
        return view;
    }
    public void setupTabLayout() {
        selectedTabPosition = viewPager.getCurrentItem();
        Toast.makeText(context, "selectedTabPosition --> "+selectedTabPosition, Toast.LENGTH_SHORT).show();
        for (int i = 0; i < tabLayout.getTabCount(); i++) {
            tabLayout.getTabAt(i).setCustomView(getTabView(i));
        }
    }

    public void removeTab(int position) {
        if (tabLayout.getChildCount() > 0 && tabLayout!=null) {
            tabLayout.removeTabAt(position);
            prefs.remove("POS"+position);

        }

    }
    /*@Override
    public void setPrimaryItem(ViewGroup container, int position, Object object) {
        if (mCurrentFragment != object) {
            mCurrentFragment = (Fragment) object;
        }
        super.setPrimaryItem(container, position, object);
    }*/

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        Object object = super.instantiateItem(container, position);
        if (object instanceof Fragment) {
            Fragment fragment = (Fragment) object;
            String tag = fragment.getTag();
            mFragmentTags.put(position, tag);
        }
        return object;
    }

    public Fragment getFragment(int position) {
        Fragment fragment = null;
        String tag = mFragmentTags.get(position);
        if (tag != null) {
            fragment = mFragmentManager.findFragmentByTag(tag);
        }
        return fragment;
    }

    @Override
    public int getItemPosition(Object object) {
            return POSITION_NONE;
        }
    @Override
    public CharSequence getPageTitle(int position) {
        return mFragmentTitleList.get(position);
    }
}

我遇到了这种奇怪的行为,即每当我创建新选项卡时,onTabSelected 函数都会多次调用,即使我创建第三个选项卡 onTabslected toast 显示Pos onTabSelected: 0,1 而不是应该是的第二个位置第 2 位。我能做些什么来解决这个问题? 我的目的是获取一些唯一的选项卡 ID,以便我可以分别识别每个选项卡

【问题讨论】:

  • 您可以根据需要使用 tab.getPosition。
  • 你能发布你的ViewPagerAdapter适配器类吗
  • @vikassingh 更新了ViewPagerAdapter
  • @mudit_sen。我试过了。它显示了位置,但正如我在问题中所说,它显示了我创建每个选项卡时的每个选项卡位置。还有当我移动或点击标签时如何显示tab.getPosition

标签: android


【解决方案1】:

您只需创建 newInstance 构造函数来创建带参数的片段 在你的 FragmentChild

public static FragmentChild  newInstance(int page, String title) {
            FragmentChild  fragmentChild = new FragmentChild ();
            Bundle args = new Bundle();
            args.putInt("someInt", page);
            args.putString("someTitle", title);
            fragmentChild.setArguments(args);
            return fragmentChild;
        }

        // Store instance variables based on arguments passed
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            page = getArguments().getInt("someInt", 0);
            title = getArguments().getString("someTitle");
        }
@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
            Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_first, container, false);
        TextView tvLabel = (TextView) view.findViewById(R.id.tvLabel);
        tvLabel.setText(page + " -- " + title);
        return view;
    }

然后在适配器类中改变这个。

@Override
    public Fragment getItem(int position) {
        return mFragmentList.get(position);
    }

@Override
    public Fragment getItem(int position) {

        return FragmentChild.newInstance(position, "Page # 1");

    }

我没有测试过这段代码,但我认为这段代码将帮助你获得你唯一的标签 ID..

测试此代码并告诉我它是否有效

【讨论】:

  • 这只会更新 FragmentChild 对吧? FragmentChild 是示例片段之一,也可以有其他片段。因此,如果我使用FragmentChild.newInstance 更新适配器类,这仅适用于 FragmentChild 对吗?
  • 还有这个fragmentFirst是什么?
  • @KarthikCP 对 .. 当您在按钮单击时添加 FragmentChild 时,您将获得相同的 FragmentChild 屏幕本身
  • 如果我将另一个片段添加到选项卡中,我该如何更改?我的意思是我必须能够添加任何片段,而不仅仅是 FragmentChild。然后我不能使用这个return FragmentChild.newInstance(position, "Page # 1");
  • 顺便说一句,当我在 FragmentChild 中登录页面时,会发生上述行为。即,在标签页上打印 0,创建新标签页时打印为 0 和 1,依此类推
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-15
  • 1970-01-01
  • 1970-01-01
  • 2015-09-19
  • 2016-12-01
相关资源
最近更新 更多