Android 如何为getResources().getString()创建SimpleFragmentPageAdapter的上下文?

Android 如何为getResources().getString()创建SimpleFragmentPageAdapter的上下文?,android,android-adapter,android-context,Android,Android Adapter,Android Context,我尝试通过其构造函数将SimpleFragmentPageAdapter的上下文传递给MainActivity,并在此上下文变量上调用getResources().getString(),以检索页面适配器中每个选项卡的标题,但未成功 非常感谢您的帮助 SimpleFragmentPageAdapter.java public class SimpleFragmentPageAdapter extends FragmentPagerAdapter { final int PAGE_COU

我尝试通过其构造函数将SimpleFragmentPageAdapter的上下文传递给MainActivity,并在此上下文变量上调用getResources().getString(),以检索页面适配器中每个选项卡的标题,但未成功

非常感谢您的帮助

SimpleFragmentPageAdapter.java

public class SimpleFragmentPageAdapter extends FragmentPagerAdapter {

    final int PAGE_COUNT = 5;
    private Context context;

    String tabOne = context.getResources().getString(R.string.kiez);
    String tabTwo = context.getResources().getString(R.string.history);
    String tabThree = context.getResources().getString(R.string.culture);
    String tabFour = context.getResources().getString(R.string.food);
    String tabFive = context.getResources().getString(R.string.green);

    private String[] tabNames = new String [] {tabOne, tabTwo, tabThree, tabFour, tabFive};

    public SimpleFragmentPageAdapter(FragmentManager fm, Context context) {
        super(fm);
        this.context = context;
    }
public class MainActivity extends AppCompatActivity {

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

        // Set view to activity:main
        setContentView(R.layout.activity_main);

        // Find ViewPager for easy swiping
        ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager);

        // Create adapater object to know which fragment should be shown based on user interaction
        SimpleFragmentPageAdapter pagerAdapter = new SimpleFragmentPageAdapter(getSupportFragmentManager(), this);

        // Set adapter to ViewPager
        viewPager.setAdapter(pagerAdapter);

        // Find TabLayout for tab identification
        TabLayout tabLayout = (TabLayout) findViewById(R.id.sliding_tabs);

        // Set ViewPager to TabLayout
        tabLayout.setupWithViewPager(viewPager);

    }
}
MainActivity.java

public class SimpleFragmentPageAdapter extends FragmentPagerAdapter {

    final int PAGE_COUNT = 5;
    private Context context;

    String tabOne = context.getResources().getString(R.string.kiez);
    String tabTwo = context.getResources().getString(R.string.history);
    String tabThree = context.getResources().getString(R.string.culture);
    String tabFour = context.getResources().getString(R.string.food);
    String tabFive = context.getResources().getString(R.string.green);

    private String[] tabNames = new String [] {tabOne, tabTwo, tabThree, tabFour, tabFive};

    public SimpleFragmentPageAdapter(FragmentManager fm, Context context) {
        super(fm);
        this.context = context;
    }
public class MainActivity extends AppCompatActivity {

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

        // Set view to activity:main
        setContentView(R.layout.activity_main);

        // Find ViewPager for easy swiping
        ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager);

        // Create adapater object to know which fragment should be shown based on user interaction
        SimpleFragmentPageAdapter pagerAdapter = new SimpleFragmentPageAdapter(getSupportFragmentManager(), this);

        // Set adapter to ViewPager
        viewPager.setAdapter(pagerAdapter);

        // Find TabLayout for tab identification
        TabLayout tabLayout = (TabLayout) findViewById(R.id.sliding_tabs);

        // Set ViewPager to TabLayout
        tabLayout.setupWithViewPager(viewPager);

    }
}
活动\u main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <android.support.design.widget.TabLayout
        android:id="@+id/sliding_tabs"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/colorPrimary"/>

    <android.support.v4.view.ViewPager
        android:id="@+id/viewpager"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>

您尝试访问尚未初始化的上下文

就这样做吧

private Context context;

private int[] tabNames = new int[] {R.string.kiez, ....};

public ViewPagerAdapter(FragmentManager fm, Context context) {
    super(fm);
    this.context = context;
}

 @Override
    public CharSequence getPageTitle(int position) {
       context.getResources().getString(tabNames[position])
 }
或更好:

private Resources resources;

private int[] tabNames = new int[] {R.string.kiez, ....};

public ViewPagerAdapter(FragmentManager fm, Resources resources) {
    super(fm);
    this.resources= resources;
}

 @Override
    public CharSequence getPageTitle(int position) {
       resources.getString(tabNames[position])
 }

context
null
在初始化
SimpleFragmentPageAdapter
之前,您需要在构造函数内移动变量的初始化:

public class SimpleFragmentPageAdapter extends FragmentPagerAdapter {

    final int PAGE_COUNT = 5;
    private Context context;

    String tabOne;
    String tabTwo;
    String tabThree;
    String tabFour;
    String tabFive;

    private String[] tabNames;

    public SimpleFragmentPageAdapter(FragmentManager fm, Context context) {
        super(fm);
        this.context = context;

        tabOne = context.getResources().getString(R.string.kiez);
        tabTwo = context.getResources().getString(R.string.history);
        tabThree = context.getResources().getString(R.string.culture);
        tabFour = context.getResources().getString(R.string.food);
        tabFive = context.getResources().getString(R.string.green);

        tabNames = new String [] {tabOne, tabTwo, tabThree, tabFour, tabFive};
    }
}

还有另一个解决方案:您的pageAdapter实际上不需要单独保存上下文

您想访问字符串,为什么不创建一个全局静态上下文来执行此任务?通常我会从我的
应用程序
实例中创建一个,这样我就可以使用上下文从我想要的任何地方获取资源


这种方法的另一个优点是,可以避免内存泄漏。那些与生命周期相关的组件不需要自己保存上下文,当应用程序处于活动状态时,
应用程序
中的上下文可以安全使用。

您可以发布activity_main.xmldone(编辑版本见上文)吗?我尝试了第二种解决方案,收到了相同的错误NPE。为了确保这一点,我对构造函数做了以下更改:SimpleFragmentPageAdapter pagerAdapter=new SimpleFragmentPageAdapter(getSupportFragmentManager(),getResources());我还尝试了第一种解决方案,但收到了相同的错误。事实上,就编程逻辑而言,与您的答案和我的原始代码没有什么不同:我已经初始化了上下文变量。隐马尔可夫模型。