需要将字符串资源转换为 viewpager 中的字符串

Need to convert a string resource to string within a viewpager

所以我尝试了各种解决这个问题的方法。这是我开始的示例:

class SimpleFragmentPagerAdapter extends FragmentPagerAdapter {

SimpleFragmentPagerAdapter(FragmentManager fm) {
    super(fm);
}

private String tabTitles[] = new String[] {"one","two","three","four"};

@Override
public CharSequence getPageTitle(int position) {
    return tabTitles[position];
}

然后我尝试了以下方法从 string.xml 中获取相同的字符串:

class SimpleFragmentPagerAdapter extends FragmentPagerAdapter {

SimpleFragmentPagerAdapter(FragmentManager fm) {
    super(fm);
}

private String tabTitles[] = new String[] {Resources.getSystem().getString(R.string.one),
    Resources.getSystem().getString(R.string.two),
    Resources.getSystem().getString(R.string.three),
    Resources.getSystem().getString(R.string.four)};

@Override
public CharSequence getPageTitle(int position) {
    return tabTitles[position];
}

但是我收到了这个错误: 致命异常:主要 进程:com.example.android.myapp,PID:9923 java.lang.RuntimeException: 无法启动 activity ComponentInfo{com.example.android.myapp/com.example.android.myapp.MainActivity}: android.content.res.Resources$NotFoundException: 字符串资源 ID #0x7f070017

因为我知道字符串存在并且我在我的代码的其他区域使用了它们我认为它可能需要上下文,所以我通过适配器传递 MainActivity.this 并尝试:

class SimpleFragmentPagerAdapter extends FragmentPagerAdapter {

private Context mContext;

SimpleFragmentPagerAdapter(FragmentManager fm, Context context) {
    super(fm);
    this.mContext = context;
}

private String tabTitles[] = new String[] {mContext.getResources().getString(R.string.one),
    mContext.getResources().getString(R.string.two),
    mContext.getResources().getString(R.string.three),
    mContext.getResources().getString(R.string.four)};

@Override
public CharSequence getPageTitle(int position) {
    return tabTitles[position];
}

并收到此错误: 致命异常:主要 进程:com.example.android.myapp,PID:5387 java.lang.RuntimeException: 无法启动 activity ComponentInfo{com.example.android.myapp/com.example.android.myapp.MainActivity}: java.lang.NullPointerException: 尝试调用虚拟方法 'android.content.res.Resources android.content.Context.getResources()' 空 object 引用

最后,我尝试在 MainActivity 中将资源转换为字符串并将它们传递给适配器:

class SimpleFragmentPagerAdapter extends FragmentPagerAdapter {

private String mOne;
private String mTwo;
private String mThree;
private String mFour;

SimpleFragmentPagerAdapter(FragmentManager fm, one, two, three, four) {
    super(fm);
    mOne = one;
    mTwo = two;
    mThree = three;
    mFour = four;
}

private String tabTitles[] = new String[] {mOne,mTwo,mThree,mFour};      

@Override
public CharSequence getPageTitle(int position) {
    return tabTitles[position];
}

它 运行 没有错误,只是导致标签页标题空白。

也许我只是一个完全的菜鸟,错过了一些简单的东西,但我很感激你们能提供的任何帮助。

看看这些代码行:

private String tabTitles[] = new String[] {mOne,mTwo,mThree,mFour};
private String tabTitles[] = new String[] {
    mContext.getResources().getString(R.string.one),
    mContext.getResources().getString(R.string.two),
    mContext.getResources().getString(R.string.three),
    mContext.getResources().getString(R.string.four)
};

问题是,这些数组是用 mOne、mTwo、mThree 和 mFour 的空值(实际上是 null)初始化的。只有在那之后,您才能在构造函数中为它们赋值。但这不会更新您的数组。看这个例子:

class SimpleFragmentPagerAdapter extends FragmentPagerAdapter {

    private Context mContext;
    private String tabTitles[];

    SimpleFragmentPagerAdapter(FragmentManager fm, Context context) {
        super(fm);
        this.mContext = context;
        tabTitles = new String[]{
            mContext.getResources().getString(R.string.one),
            mContext.getResources().getString(R.string.two),
            mContext.getResources().getString(R.string.three),
            mContext.getResources().getString(R.string.four)
        };
    }

    @Override
    public CharSequence getPageTitle(int position) {
        return tabTitles[position];
    }
}

我在这里所做的是说 "Hey Java, there is a String array called tabTitles, which is not initialized (it has null value)." 然后,在构造函数中,"Hey Java, assign these values to array called tabTitles"。现在,当调用 getPageTitle(int position) 时,