Получение текущей выбранной вкладки активности с вкладками

Итак, в настоящее время я разрабатываю приложение, которое отображает файл json с помощью карточек в основном действии. В зависимости от того, какая вкладка в данный момент выбрана в моей активности с вкладками, метод, который загружает файл json, решает, какой файл json загрузить (я передаю целое число, и в методе есть переключатель).

Вот метод:

Fragment.Downloadjson(rootview,integer,context);

Теперь для моей активности с вкладками у меня есть SectionsPagerAdapter, в котором есть обычные вещи: getItem, getCount и getPageTitle.

В getItem я создаю свои новые фрагменты:

    @Override
        public Fragment getItem(int position) {
            View v1 = getWindow().getDecorView().getRootView();
            switch (position) {
                case 0:
                    //Fragment.Download(v1,0,getApplicationContext());
                    return new Fragment().f(Fragment.page.TODAY);
                case 1:
                    //Fragment.Download(v1,1,getApplicationContext());
                    return new Fragment().f(Fragment.page.TOMORROW);
                default:
                    return new Fragment();
            }
        }

Исключение :

android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application

Я обнаружил, что источником этой ошибки является параметр rootview в моем методе, потому что он работает в onCreateView с параметром rootView, потому что я определяю его там. Однако я не могу сделать оператор if для текущей выбранной вкладки или отображаемого в данный момент фрагмента, потому что

а) я не знаю, как получить текущую выбранную вкладку

б) я не уверен, что он снова загрузит файл json после того, как я переключу вкладку, потому что в конце концов оператор If будет в onCreateView

Итак, мой вопрос,

как мне это решить?


person just_deko    schedule 05.04.2016    source источник
comment
проверьте эту ссылку для получения текущей вкладки stackoverflow.com/questions/3583405/   -  person Brahmam Yamani    schedule 05.04.2016
comment
@BrahmamYamani У меня нет активности с вкладками, я использую предварительно созданную активность с вкладками из студии Android. Поэтому я не могу использовать Tabhost.   -  person just_deko    schedule 05.04.2016


Ответы (1)


Не делайте этого внутри метода getItem(). В getItem просто создайте фрагмент.

@Override
public Fragment getItem(int position) {
    switch (position) {
        case 0:
            return new MyFragment0();
        case 1:
            return new MyFragment1();
        case 2:
            return new MyFragment2();
    }
    return null;
}

Переопределите метод instantiateItem и сохраните карту фрагментов и их положение:

private ArrayMap<Integer, MyFragmentBaseClass> mPagerFragmentMap = new ArrayMap<>();


    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        MyFragmentBaseClass fragment = (MyFragmentBaseClass) super.instantiateItem(container, position);
        mPagerFragmentMap.put(position, fragment);

        return fragment;
    }

примечание MyFragmentBaseClass может быть интерфейсом маркера, который реализуют все фрагменты.

С помощью приведенного выше кода вы уже можете сопоставить каждый фрагмент с его вкладкой.

Если вы используете TabLayout, теперь вы можете установить прослушиватель с помощью setOnTabSelectedListener и использовать один из его методов onTabSelected, чтобы знать, когда пользователь выбирает эту вкладку, и выполнять любую операцию, которую вы хотите.

person Aitor Viana    schedule 05.04.2016
comment
А если у меня нет Tablayout? - person just_deko; 05.04.2016
comment
По-разному. Что вы используете для реализации вкладок? Единственное, что вам нужно, это иметь возможность обнаруживать выбор вкладки. - person Aitor Viana; 06.04.2016
comment
Устаревший Tablistener и все устаревшие методы вкладок (когда вы создаете новое действие, есть предустановка действия с вкладками, это то, что я использую). Поскольку этот экземпляр возвращает текущий фрагмент, мне нужен какой-то метод, который что-то делает, когда я меняю вкладку. Как мне это сделать? - person just_deko; 06.04.2016
comment
Моя Android Studio создает активность с вкладками, используя пейджер представления (так же, как я предполагал ранее). Я никогда не использовал TabListener, вы имеете в виду ActionBar.TablListener? Если это так, у него есть методы для onTabSelected (см. developer.android.com/reference /андроид/приложение/) - person Aitor Viana; 06.04.2016
comment
И последний вопрос: если я хочу использовать свой метод Fragment.Downloadjson(rootview,integer,context); в onTabSelected, как я могу передать rootview этому методу? - person just_deko; 06.04.2016
comment
Если метод onTabSelected находится внутри класса, который имеет rootview, просто сделайте его полем класса, чтобы вы могли получить к нему доступ. - person Aitor Viana; 06.04.2016
comment
а если нет? мой rootview находится в onCreateView, а onTabSelected просто стоит отдельно в классе активности. Получение rootview для других методов также было проблемой для меня, потому что ни один из современные методы работают для меня. Я думаю, это потому, что onTabSelected вызывается до создания фактического представления. - person just_deko; 08.04.2016
comment
Можете ли вы опубликовать код? не понял где что :D - person Aitor Viana; 08.04.2016
comment
Конечно: pastebin.com/qBABbVyx это моя основная деятельность, и мне нужно запустить мой метод Download (строка 249) в некоторые моменты, например в onResume или, как я уже сказал, onTabSelected. - person just_deko; 08.04.2016
comment
Приватное mPagerFragmentMap должно быть полем вашего MainActivity. Каждый фрагмент должен хранить копию rootView как поле фрагмента. Вы можете реализовать метод получения getRootView. Наконец, в onTabSelected просто получите rootview фрагмента с помощью mPagerFragmentMap.get(tab.getPosition()).getRootView() и используйте его по своему усмотрению. - person Aitor Viana; 09.04.2016