Как я могу получить доступ к локализованным строкам из статического FragmentPagerAdapter

Я следил за официальной документацией о том, как реализовать прокрутку с помощью TabStrip вместо вкладок для создания фрагмента (FragmentMyAccount.class), содержащего вложенные фрагменты (FragmentMyProfile.class и FragmentMyLibrary.class). Эти вложенные фрагменты соответствуют двум вкладкам, управляемым childFragmentManager.

Две вкладки и pagerSlidingTabStrip от astuetz работают нормально, но метод getPageTitle адаптера не имеет доступа к ресурсам String и может возвращать только жестко закодированную строку для заголовка каждой вкладки (см. внизу кода). Ошибка времени компиляции, которая появляется, когда я пытаюсь получить доступ к ресурсам xml, гласит:

"FragmentMyAccount.this cannot be referenced from a static context"

Если приведенный ниже код невозможно настроить, какая альтернативная реализация будет адекватной для достижения моей цели?

package com.kouretinho.myapp;

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.astuetz.PagerSlidingTabStrip;


public class FragmentMyAccount extends Fragment {

private static final int NUM_ITEMS = 2;

MyAccountAdapter mAdapter;
ViewPager mPager;
PagerSlidingTabStrip mTabStrip;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
}

@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.fragment_my_account, container, false);

    // Initialize the FragmentPager Adapter
    mAdapter = new MyAccountAdapter(getChildFragmentManager());

    // Initialize the ViewPager and set an adapter
    mPager = (ViewPager) rootView.findViewById(R.id.viewpager_my_account);
    mPager.setAdapter(mAdapter);

    // Initialize the TabStrip and bind the tabs to the ViewPager
    mTabStrip = (PagerSlidingTabStrip) rootView.findViewById(R.id.viewpager_tab_strip);
    mTabStrip.setViewPager(mPager);

    return rootView;
}

@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
}

@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
}

public static class MyAccountAdapter extends FragmentPagerAdapter{

    private static final int MY_PROFILE = 0;
    private static final int MY_LIBRARY = 1;
    private static final String sExceptionMessage = "FragmentPagerAdapter was asked to getItem " +
            "with position other than 0 or 1. This FragmentPagerAdapter can only return one of" +
            "two Fragments at position 0 or 1.";

    public MyAccountAdapter(FragmentManager fm){
        super(fm);
    }

    @Override
    public int getCount() {
        return FragmentMyAccount.NUM_ITEMS;
    }

    @Override
    public Fragment getItem(int position) {
        switch (position){
            case MY_PROFILE:
                return new UserProfileFragment();
            case MY_LIBRARY:
                return new UserBooksFragment();
            default:
                throw new IllegalStateException(sExceptionMessage);
        }
    }

    @Override
    public CharSequence getPageTitle(int position) {

        switch (position){
            case MY_PROFILE:
// **********  THIS LINE IS PROBLEMATIC, cannot get Localised String resources
               return  FragmentMyAccount.this.getActivity().getResources().getString(R.id.my_profile);
            case MY_LIBRARY:
                return "my_library";
            default:
                return "no_title";
        }
    }
}

}


person kouretinho    schedule 20.09.2014    source источник


Ответы (1)


В вашем случае вы должны заменить:

public static class MyAccountAdapter extends FragmentPagerAdapter

с

public class MyAccountAdapter extends FragmentPagerAdapter

Другой способ исправить это — передать Context в MyAccountAdapter в конструкторе (как вы делаете с FragmentManager).

person Ayzen    schedule 20.09.2014
comment
Вау, так просто и так правильно! Я удалил статическое ключевое слово, и оно отлично сработало. Однако я до сих пор не понимаю, почему документация предлагает открытый статический класс вместо простого открытого класса. - person kouretinho; 20.09.2014
comment
Возможно, им просто не нужен доступ к методам экземпляра или полям родительского класса... - person Ayzen; 20.09.2014