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

时间:2017-04-06 19:52:48

标签: java android string android-viewpager android-resources

所以我尝试了各种解决方案来解决这个问题。这是我开始的地方的一个例子:

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:无法启动活动ComponentInfo {com.example.android.myapp / com.example.android.myapp.MainActivity}:android.content.res.Resources $ NotFoundException:String resource 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:无法启动活动ComponentInfo {com.example.android.myapp / com.example.android.myapp.MainActivity}:java.lang.NullPointerException:尝试调用虚方法' android.content。 res.Resources android.content.Context.getResources()'在空对象引用上

最后,我尝试将资源转换为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];
}

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

也许我只是在这里做一个完整的菜鸟并且遗漏了一些简单的东西,但我很感激你们能提供的任何帮助。

1 个答案:

答案 0 :(得分:2)

看看这些代码行:

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的空(实际上是空)值初始化的。只有在那之后,您才在构造函数中为它们分配值。但这不会更新您的阵列。看看这个例子:

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,有一个名为tabTitles的String数组,它没有被初始化(它有空值)。”然后,在构造函数中,“嘿Java,将这些值分配给名为tabTitles的数组”。现在,当调用getPageTitle(int position)时,