从ViewPager/TabLayout中移除选项卡的焦点

3

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

1)目前,如果我按DPAD_UP,焦点会移到选项卡上,但是页面实际上不会更改到与所选选项卡相对应的页面,直到按下DPAD_CENTER。因此,聚焦(以灰色框围绕标签文本显示)和选中(以下划线显示)之间存在差异。我想知道是否可能让任何获得焦点的对象被选中?

2)我的ViewPager中有3个选项卡,其中选项卡1中的片段需要获得焦点才能正常显示。当我从选项卡3切换到选项卡1时,焦点没有移动到片段,而仍停留在选项卡上。这会导致我的片段无法正常显示。我想知道是否有一种方法可以将焦点从选项卡中移开?我查看了ViewPager和TabLayout的源代码,我知道焦点是在TabLayout的TabView上,但无论我尝试什么,都不能夺取TabView的焦点状态(即灰色框围绕着标签文本,直到我使用DPAD_DOWN“向下”到达片段)。

尝试 ((ViewGroup) tabLayout.getChildAt(0)).getChildAt(desiredPosition).clearFocus() ,但没有帮助。 我不想使用viewPager.setOffscreenPageLimit(2);

// This is my viewpager activity class
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_view_pager);

    ViewPager viewPager = (ViewPager) findViewById(R.id.viewPager);
    adapterViewPager = new MyPagerAdapter(getFragmentManager());
    viewPager.setAdapter(adapterViewPager);

    // Give the TabLayout the ViewPager
    TabLayout tabLayout = (TabLayout) findViewById(R.id.sliding_tabs);
    tabLayout.setupWithViewPager(viewPager);

    tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
        @Override
        public void onTabSelected(TabLayout.Tab tab) {
            // Tried to clear focus of tab here, didn't help
        }

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

        }

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

        }
    });
}


public static class MyPagerAdapter extends FragmentPagerAdapter {
    private static int NUM_ITEMS = 3;

    public MyPagerAdapter(FragmentManager fragmentManager) {
        super(fragmentManager);
    }

    // Returns total number of pages.
    @Override
    public int getCount() {
        return NUM_ITEMS;
    }

    // Returns the fragment to display for a particular page.
    @Override
    public Fragment getItem(int position) {
        switch (position) {
            case 0:
                return new OneFragment; // This is the fragment that needs focus
            case 1:
                return new TwoFragment();
            case 2:
                return new ThreeFragment();
            default:
                return null;
        }
    }

    // Returns the page title for the top indicator
    @Override
    public CharSequence getPageTitle(int position) {
        if (position == 0) {
            return "Fragment 1";
        } else if (position == 1) {
            return "Fragment 2";
        } else {
            return "Fragment 3";
        }
    }

}


<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <android.support.design.widget.TabLayout
        android:id="@+id/sliding_tabs"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:tabMode="fixed"
        android:theme="@style/AppThemeTab" />

    <android.support.v4.view.ViewPager
        android:id="@+id/viewPager"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    </android.support.v4.view.ViewPager>

</RelativeLayout>

非常感谢您的帮助!如有需要,请随时联系我们。


你尝试在片段内的一个视图中请求焦点了吗? - lib4backer
我宁愿不在片段中请求焦点,因为我无法控制该片段,尽管我知道如果我在片段中请求焦点,问题2就会得到解决。 - kent218
对于第一个问题,你不能使用分发键事件吗? - lib4backer
问题在于,我甚至无法在具有焦点的视图上使用焦点更改侦听器。由于焦点在选择之前出现,因此当焦点发生变化时,我将不得不调度键事件。接着,又出现了一个问题,我无法检测到焦点。 - kent218
我的情况恰恰相反,我无法将焦点返回到选项卡上。有什么想法吗? - undefined
1个回答

2

一行代码解决问题 :) 。如果选项卡是可滚动的(即通过数字键盘滚动选择选项卡),请使用下面的代码片段来禁止对Tablayout子视图的焦点:

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

这对我不起作用 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接