【问题标题】:Android Tablayout selectAndroid Tablayout 选择
【发布时间】:2016-09-24 18:17:04
【问题描述】:

我的片段中有两个选项卡的 tablayout。问题是当我运行这个片段时,它一开始并没有显示我的第一个片段。但是当我选择第二个选项卡并返回第一个选项卡时它工作正常吗? 我该如何解决这个问题?

我已经看到了这个:Android TabLayout select first Tab on Startup,但它根本没有帮助。

public class FriendsFragment2 extends Fragment {

TabLayout tabs_fragment;
FriendshipFragment fragment1;
RequestFrienshipFragment fragment2;


public FriendsFragment2() {
    // Required empty public constructor
}


@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container
        , @Nullable Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.fragment_friends2, container, false);
    tabs_fragment = (TabLayout) rootView.findViewById(R.id.tabs_fragment);


    setupTabLayout();

    EventTab();
    tabs_fragment.getTabAt(0).select();
    return rootView;
}


private void setupTabLayout() {

    fragment1 = new FriendshipFragment();
    fragment2 = new RequestFrienshipFragment();
    tabs_fragment.addTab(tabs_fragment.newTab().setText("two"));
    tabs_fragment.addTab(tabs_fragment.newTab().setText("one"));


}


private void EventTab() {
    tabs_fragment.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
        @Override
        public void onTabSelected(TabLayout.Tab tab) {

                setCurrenttabFragment(tab.getPosition());
        }

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

        }

        @Override
        public void onTabReselected(TabLayout.Tab tab) {

        }
    });
}


private void setCurrenttabFragment(int tabPosition) {



    switch (tabPosition) {

        case 0:
        replaceFragment(fragment1);
            break;

        case 1:
            replaceFragment(fragment2);
            break;
    }
}


private void replaceFragment(Fragment fragment) {
    FragmentManager fm = getChildFragmentManager();
    FragmentTransaction ft = fm.beginTransaction();
    ft.replace(R.id.frame_container_friends_fragment, fragment);
    ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
    ft.commit();

}

}

【问题讨论】:

  • 我不知道你为什么要让你的生活变得复杂。您可以简单地使用带有标签的 viewpager。它有一个简单的库,可以为你处理一切。
  • 我无法使用 ViewPager,因为每次刷卡时它都不会刷新
  • 在这种情况下,我建议您完成片段生命周期。如果你想刷新你的片段,你应该重写 onResume 方法。并且在您的情况下还有很多片段实例会像地狱一样减慢您的应用程序。

标签: android select android-tablayout


【解决方案1】:

首先,您可以将 viewpager 与标签一起使用,而不是弄乱古老的代码。但是,如果您想以已知的方式解决问题,那么

  1. 永远不要在onCreateView()中执行非UI相关的任务
  2. 覆盖 onActivityCreated() 并将这部分转移到 onActivity created

``

public void onActivityCreated(Bundle savedInstanceState){
    super.onActivityCreated(savedInstanceState);
    setupTabLayout();
    EventTab();
    tabs_fragment.getTabAt(0).select();
}
  1. 最重要的部分

tabs_fragment.getTabAt(0).select();替换为

tabs_fragment.post(new Runnable() {
            @Override
            public void run() {
               tabs_fragment.getTabAt(0).select(); 
            }
        });

您面临的问题是因为您的tabs_fragment 尚未准备好,您正在对其执行操作。但是通过执行上述步骤,可以确保在您对其执行任何操作时您的选项卡已准备就绪。

EDIT :在添加自身时将选项卡标记为 selectewd。 According to this doc 然后

private void setupTabLayout() {

    fragment1 = new FriendshipFragment();
    fragment2 = new RequestFrienshipFragment();
    tabs_fragment.addTab(tabs_fragment.newTab().setText("two"));
    tabs_fragment.addTab(tabs_fragment.newTab().setText("one"), true);


}

您查看的链接有一个处理程序有一些延迟。即使在延迟之后,您的视图也可能没有准备好。所以正确的方法是将runnable应用到视图本身。这将确保仅在视图准备好时才调用 runnable。

【讨论】:

  • 我不知道为什么,但这并不能解决我的问题。谢谢您的宝贵时间
  • 我仍然建议您使用带有标签的 viewpager。并遵循适当的片段生命周期进行刷新。
  • 我也试过了,我确实使用了 onResume 并调用了我的 getData() 方法。每次滑动时它都会刷新,但它没有从服务器获取数据。
  • 是的,你能不能也更新一下getData代码,我觉得这里更重要
  • 请再看一遍答案,我更新了一点。现在可能有帮助
猜你喜欢
  • 2015-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多