2016-07-06 3 views
2

У меня есть приложение с четырьмя вкладками, каждая вкладка имеет некоторые Редактирование текста, некоторые из них необходимо заполнить для выполнения операции БД, поэтому, когда пользователь нажимает кнопку «Сохранить» изменения ", метод проверяет те, которые редактируют текст, и должен сфокусировать вас на первом, который пуст, эта работа прекрасна, но с проблемой: requestFocus(); не изменит вкладку, если Редактировать текст находится в другом.Как получить родительскую вкладку в представлении пейджера

Тогда я пытаюсь использовать ViewPager.setCurrentItem(int) изменить вкладку перед requestFocus(); но то, что я не могу понять, как:

Как получить вкладку Редактирование текста в?

+0

На самом деле, я не могу правильно понять вашу проблему, пытаетесь ли вы g et текущая вкладка. –

+0

@AmanJain no, текст редактирования void может быть или не быть на текущей вкладке, поэтому я хочу знать, что в вкладке witch это –

+0

Вы можете добавить onFocusChange listener в свою вкладку. –

ответ

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; 
        } 
    } 
    

    и проверить, является ли текущий элемент вашей страницы

Это скорее хак, чем реальное решение, но должна работать

Надежда это час ELPS

UPDATE

Добавлен код для езды на велосипеде через родителей

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(); 
    } 
} 
+0

Спасибо, что помогли! [это то, что я наконец сделал] (http://stackoverflow.com/a/38224106/6470431) –

+0

@WestsideTony обновил ответ для (на мой взгляд) лучшего решения для поиска Фрагмента. Он работает с разными уровнями вложенности – rsella

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 
Смежные вопросы