2014-01-10 5 views
0

У меня есть ViewPager с тремя вкладками. Один из вкладок (на самом деле фрагменты) содержит EditText.Android ViewPager и EditText

Вот проблема: когда я прокручиваю этот фрагмент (когда он находится в фокусе), я хочу показать клавиатуру, и когда я перейду к следующей вкладке, я хочу скрыть клавиатуру. Проблема в том, что в ViewPager фрагмент уничтожается только после того, как я провёл третий фрагмент, что означает, что клавиатура остается открытой, когда фрагмент без EditText находится в фокусе. И еще одна проблема заключается в том, что когда я прокручиваю от третьего фрагмента до второго (что, повторяю, не имеет управления EditText), потому что ViewPager создает два фрагмента в строке. Надеюсь, что я достаточно ясен, если не попытаюсь это объяснить. Есть ли способ создать фрагмент в ViewPager только тогда, когда он сосредоточится и сохранит свое состояние, когда сосредоточится? Спасибо ...

EDIT

Вот мой адаптер:

public class TabPagerAdapter extends FragmentPagerAdapter { 
private List<Fragment> fragments; 

public TabPagerAdapter(FragmentManager fm, List<Fragment> fragments) { 
    super(fm); 
    this.fragments = fragments; 
} 

@Override 
public Fragment getItem(int position) { 
    return this.fragments.get(position); 
} 

@Override 
public void setPrimaryItem(ViewGroup container, int position, Object object) { 
    super.setPrimaryItem(container, position, object); 
    fragments.get(position); 
} 

@Override 
public int getCount() { 
    return this.fragments.size(); 
} 
} 
+0

Возможный дубликат [Закрытие клавиатуры в ViewPager] (http://stackoverflow.com/questions/14600104/closing- keyboard-in-viewpager) – DoubleK

ответ

2

Есть ли какой-нибудь способ, чтобы создать экземпляр фрагмента в ViewPager только тогда, когда он приходит в центре внимания и сохранить свое состояние, когда его внимание?

Да, есть. фактически, PagerAdapter имеет метод обратного вызова - setPrimaryItem. в соответствии с документацией:

Вызывается для информирования адаптера, в отношении которого элемент в настоящее время считается «основным», то есть единственным показателем для пользователя в качестве текущей страницы.

она работает очень хорошо, и, как ожидалось, и я использую его сам на некоторое время именно от причины вы описали - показ/скрытие клавиатуры для соответствующей страницы ..

о сохранении состояния - ничего не позволяйте вам хранить массив объектов из любой структуры данных, которую вы хотите, чтобы каждый из них содержал поля, представляющие элемент в определенной позиции внутри адаптера.

EDIT

вы должны использовать setPrimaryItem обратный вызов, как это:

@Override 
public void setPrimaryItem(ViewGroup container, int position, Object object) { 
    super.setPrimaryItem(container, position, object); 

    //assuming fragment in position 0 suppose to show keyboard, and others not. 
    if (position == 0) { 
     showKeyboardExplicitly(); 
    } else { 
     hideKeyboardExplicitly(); 
    } 
} 
+0

Я попробовал, но не работал для меня ... – pavle

+0

@pavle: Я вижу в вашем коде, что вы не делаете ничего значимого в методе setPrimaryItem. если да - то, чего вы точно ожидаете? –

+0

Я добавил код, демонстрирующий ... –

Смежные вопросы