如何在View分页器中获取父选项卡

时间:2016-07-06 08:14:53

标签: android android-viewpager

我有一个带有四个标签的应用程序,每个标签都有一些编辑文本,其中一些需要填充才能执行数据库操作,因此当用户按下“保存更改”按钮时,方法会检查这些编辑文本和应该把你的注意力集中在第一个空的,这个工作正常但有问题:如果编辑文本在另一个中,requestFocus();将不会更改选项卡。

然后我尝试使用ViewPager.setCurrentItem(int)更改requestFocus();之前的标签,但我无法弄清楚:

如何获取编辑文本的标签?

2 个答案:

答案 0 :(得分:1)

ViewPager班级没有这方法。

一个非常hacky的解决方案可以是(假设您正在使用FragmentStatePagerAdapter):

  • getParent()上调用EditText所需的父级片段次数。所以,如果你有这样的结构: 片段 - > LinearLayout - > EditText 您应该拨打getParent()两次。然后将ViewParent投射到Fragment。您实际上可以使用while循环进行循环,直到找到ViewParent的实例Fragment

  • 循环访问适配器片段

    for ( int i = 0; i < adapter.getCount(); i++) {
        if (adapter.getItem(i) == parentTakenBefore) {
            viewPager.setCurrentItem(i);
            break;
        }
    }
    

    并检查当前项目是否为您的页面

它更像是一个黑客而不是真正的解决方案,但应该有效

希望有所帮助

<强>更新

添加了通过父母循环的代码

boolean isFragment = false;
Fragment fragment = null;
ViewParent currentParent = v.getParent();
while(!isFragment && currentParent != null){
    if (currentParent instanceof Fragment) {
        fragment = (Fragment) currentParent();
        isFragment = true;
    }
    else {
        currentParent = currentParent.getParent();
    }
}

答案 1 :(得分:0)

由于某种原因,View pageradapter似乎没有认出他们的孩子,我终于想出了一个解决方案。

首先创建添加到寻呼机的视图列表

static ArrayList<View> tabs= new ArrayList<>();

然后在添加新标签时也将其添加到列表中

tab= inflater.inflate(R.layout.any_tab, container, false);
tabs.add(tab);

最后实现类似于建议的循环,但这也搜索父母

//e=The empty text view;

View v=e;
Boolean b=true;
int ctrl=0;
while(b){
    v=(View)v.getParent();//this keep getting the parent view until reaches the tab
    ctrl=0;
    for(View t:tabs){
        if(v==t){
            b=false;
            break;}
        else{ctrl ++;}
    }
}
mViewPager.setCurrentItem(ctrl);//this place you in the right tab
e.requestFocus();//this focus the text view