我有一个带有四个标签的应用程序,每个标签都有一些编辑文本,其中一些需要填充才能执行数据库操作,因此当用户按下“保存更改”按钮时,方法会检查这些编辑文本和应该把你的注意力集中在第一个空的,这个工作正常但有问题:如果编辑文本在另一个中,requestFocus();
将不会更改选项卡。
然后我尝试使用ViewPager.setCurrentItem(int)
更改requestFocus();
之前的标签,但我无法弄清楚:
如何获取编辑文本的标签?
答案 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 pager
或adapter
似乎没有认出他们的孩子,我终于想出了一个解决方案。
首先创建添加到寻呼机的视图列表
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