Android(为什么在创建选项卡时会调用onTabSelected())

五陵年少金市东,银鞍白马渡春风。这篇文章主要讲述Android:为什么在创建选项卡时会调用onTabSelected?相关的知识,希望能为你提供帮助。
当操作栏有标签时,我注意到当活动在屏幕上加载时会调用onTabSelected。每当发生方向改变时也会调用它。我的代码根据所选的选项卡查询数据库,并将查询结果显示给加载的布局。
我的问题是在恢复状态下保存选项卡状态,当前选择的选项卡为1或更高,因为默认情况下在0选项卡上调用onTabSelected,当恢复状态选项卡为1或更高时,将再次调用它。这使得选项卡0上的数据库查询无效。
如何配置android在创建选项卡时不调用onTabSelected或至少检测到此调用是默认的而不是用户触发的?

@Override public void onTabSelected(Tab tab, FragmentTransaction ft) { int tabPos = tab.getPosition(); switch(tabPos) { case 0: // query database and display result break; case 1: // a different query and display result break; case 2: ... } }@Override public void onRestoreInstanceState(Bundle savedInstanceState) { if(savedInstanceState.containsKey(STATE_SELECTED_TAB)) { getActionBar().setSelectedNavigationItem(savedInstanceState.getInt(STATE_SELECTED_TAB)); } super.onRestoreInstanceState(savedInstanceState); }@Override public void onSaveInstanceState(Bundle outState) { outState.putInt(STATE_SELECTED_TAB, getActionBar().getSelectedNavigationIndex()); super.onSaveInstanceState(outState); }

添加了复杂功能:当前选中的选项卡为0且方向发生变化时,onTabSelected仍会被调用两次!一旦最初创建选项卡,第二次onRestoreState恢复保存的选项卡选择状态,即使它是0。
我最初的假设是onTabSelected被调用两次,但我错了。这是我的片段onCreateView被调用两次,片段事务中的一些错误在方向更改时添加了两次相同的片段。 onTabSelected被调用一次,当恢复的选项卡也为0时,也会调用onTabReselected的恢复状态调用。
在搜索SO和谷歌之后,我发现这个问题有类似的问题原因。 Creating ActionBar tab also calling its selectTab functions
答案因此,在从Google的Android站点查看ActionBar上的参考文档后,addTab方法是负责默认调用onTabSelected的方法。
public abstract void addTab (ActionBar.Tab tab)

添加选项卡以在选项卡式导航模式中使用。该选项卡将添加到列表的末尾。如果这是第一个要添加的选项卡,它将成为选定的选项卡。
参数 选项卡要添加的标签
顺便提一下,存在不调用onTabSelected的其他重载方法。
public abstract void addTab (ActionBar.Tab tab, boolean setSelected)

所以我使用了这些替代方法,并修复了问题。但是,一旦显示选项卡,第一个选项卡可能会显示为选中,即使它不是。单击它将调用onTabSelected而不是onTabReselected。
另一答案我用这种方式解决了它:
setupWithViewPager之前打电话给tabLayout.addOnTabSelectedListener
tabLayout.setupWithViewPager(viewPager)tabLayout.addOnTabSelectedListener(object :TabLayout.OnTabSelectedListener { override fun onTabSelected(tab: TabLayout.Tab?) {....} ..... }

因为当你调用setupWithViewPager时,这将在内部调用setOnTabSelectedListener(new ViewPagerOnTabSelectedListener(viewPager));
所以你最好在将tabSelect Listener添加到tabLayout之前调用它
另一答案我想你可以这样做(并忽略任何拼写请:-)):
public class MainActivity extends FragmentActivity {boolean isConfigChanged; int savedTabIndex; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); if(savedInstanceState != null){ if(savedInstanceState.containsKey(STATE_SELECTED_TAB)) { savedTabIndex = savedInstanceState.getInt(STATE_SELECTED_TAB); //getActionBar().setSelectedNavigationItem(savedTabIndex); actually you do not need this } isConfigChanged = true; }// here add actionbar tabs//...}

并在:
下面的代码检查,如果configuration更改,用户选择的选项卡是not zero所以这是默认调用并忽略但是如果isConfigChanged == true和用户选择的选项卡是0你must query DB或者如果isConfigChanged == false你必须查询DB,因为它是第一次加载应用程序。一个快速的游戏可能适合你想要的。
@Override public void onTabSelected(Tab tab, FragmentTransaction ft) { if(isConfigChanged & & savedTabIndex != 0){ isConfigChanged = false; return; } isConfigChanged = false; int tabPos = tab.getPosition(); switch(tabPos) { case 0: // query database and display result break; case 1: // a different query and display result break; case 2: ... } }

【Android(为什么在创建选项卡时会调用onTabSelected())】删除onRestore
@Override public void onSaveInstanceState(Bundle outState) { outState.putInt(STATE_SELECTED_TAB, getActionBar().getSelectedNavigationIndex()); super.onSaveInstanceState(outState); }


    推荐阅读