Android 在ViewPager/TableLayout中将焦点从选项卡移开

Android 在ViewPager/TableLayout中将焦点从选项卡移开,android,android-fragments,android-viewpager,android-tablayout,fragmentpageradapter,Android,Android Fragments,Android Viewpager,Android Tablayout,Fragmentpageradapter,我正在Android TV上使用ViewPager/TabLayout,我有两个问题 1) 目前,如果我按下DPAD_向上键,焦点将转到选项卡,但在按下DPAD_CENTER之前,页面实际上不会更改为与焦点选项卡相对应的页面。因此,聚焦(显示为选项卡文本周围的灰色框)和选中(显示为下划线)之间存在差异。我想知道是否有可能选择任何重点 2) 我的ViewPager中有3个选项卡,其中tab1中的片段需要有焦点才能正确显示。当我从tab3切换到tab1时,焦点不会被赋予片段,而是停留在tab上。这导

我正在Android TV上使用ViewPager/TabLayout,我有两个问题

1) 目前,如果我按下DPAD_向上键,焦点将转到选项卡,但在按下DPAD_CENTER之前,页面实际上不会更改为与焦点选项卡相对应的页面。因此,聚焦(显示为选项卡文本周围的灰色框)和选中(显示为下划线)之间存在差异。我想知道是否有可能选择任何重点

2) 我的ViewPager中有3个选项卡,其中tab1中的片段需要有焦点才能正确显示。当我从tab3切换到tab1时,焦点不会被赋予片段,而是停留在tab上。这导致我的片段无法正确显示。我想知道是否有一种方法可以将注意力从账单上移开?我深入研究了ViewPager和TabLayout的源代码,我知道TabLayout的TabView是焦点,但无论我怎么做,我都无法去掉TabView的焦点状态(即,在我使用DPAD_DOWN“向下”到片段之前,标签文本周围的灰色框不会消失)

尝试
((视图组)tabLayout.getChildAt(0)).getChildAt(desiredPosition).clearFocus()
,它没有帮助。 我不想使用
viewPager.setOffscreenPageLimit(2)

//这是我的viewpager活动类
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u view\u pager);
ViewPager ViewPager=(ViewPager)findViewById(R.id.ViewPager);
AdapterViewPage=新的MyPagerAdapter(getFragmentManager());
设置适配器(adapterViewPager);
//将视图页导航提供给表格布局
TabLayout TabLayout=(TabLayout)findViewById(R.id.SLIVING_选项卡);
tabLayout.setupWithViewPager(viewPager);
tabLayout.addOnTabSelectedListener(新的tabLayout.OnTabSelectedListener(){
@凌驾
已选择的公共选项卡(TabLayout.Tab){
//试图清除选项卡的焦点,但没有帮助
}
@凌驾
已选择的公共选项卡(TabLayout.Tab){
}
@凌驾
已重新选择公共选项卡(TabLayout.Tab){
}
});
}
公共静态类MyPagerAdapter扩展了FragmentPagerAdapter{
私有静态int NUM_ITEMS=3;
公共MyPagerAdapter(碎片管理器碎片管理器){
超级(碎片管理器);
}
//返回总页数。
@凌驾
public int getCount(){
返回NUM_项;
}
//返回要为特定页面显示的片段。
@凌驾
公共片段getItem(int位置){
开关(位置){
案例0:
return new OneFragment;//这是需要焦点的片段
案例1:
返回新的TwoFragment();
案例2:
返回新的ThreeFragment();
违约:
返回null;
}
}
//返回顶部指示器的页面标题
@凌驾
公共字符序列getPageTitle(int位置){
如果(位置==0){
返回“片段1”;
}否则如果(位置==1){
返回“碎片2”;
}否则{
返回“碎片3”;
}
}
}
非常感谢您的帮助,谢谢

一行解决方案:)。若要抑制对Tablayout子视图的关注,请使用下面的代码片段,假设选项卡是可滚动的-即选项卡选择是通过digipad滚动的:

tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);        
tabLayout.setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS);

你试过在片段内部的一个视图中请求焦点吗?我不想在片段中请求焦点,因为我无法控制该片段,尽管我知道如果我在片段中请求焦点,问题2就解决了。对于第一个问题,您不能使用dispatch key event吗?问题是我甚至不能在具有焦点的视图上使用焦点更改侦听器。因为焦点在select之前,所以当焦点改变时,我必须调度key事件。然后,问题来了,我无法检测到焦点。
tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);        
tabLayout.setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS);