如何在ViewPager适配器中获取字符串资源?

19

我试图为我的viewpager设置标题,但似乎无法成功。我尝试了Resources.getSystem().getString(R.string.title1);和传递上下文的方法,有人能帮帮我吗?

public class ViewPagerAdapter extends FragmentPagerAdapter {
    final int PAGE_COUNT = 3;
    Context context;

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

    @Override
    public int getCount() {
        return PAGE_COUNT;
    }

    @Override
    public Fragment getItem(int position) {
        return PageFragment.create(position + 1);
    }

    @Override
    public CharSequence getPageTitle(int position) {

        switch (position) {

        case 0:
            return Resources.getSystem().getString(R.string.title1);

        case 1:
            return Resources.getSystem().getString(R.string.title1);

        case 2:
            return Resources.getSystem().getString(R.string.title1);
        }

        return null;
    }
}

日志记录:

09-02 17:40:33.160: E/AndroidRuntime(3116): FATAL EXCEPTION: main
09-02 17:40:33.160: E/AndroidRuntime(3116): android.content.res.Resources$NotFoundException: String resource ID #0x7f050003
09-02 17:40:33.160: E/AndroidRuntime(3116):     at android.content.res.Resources.getText(Resources.java:230)
09-02 17:40:33.160: E/AndroidRuntime(3116):     at android.content.res.Resources.getString(Resources.java:314)
9个回答

46

你应该从Activity的上下文中调用getString方法,修改你的代码为

public class ViewPagerAdapter extends FragmentPagerAdapter {
    final int PAGE_COUNT = 3;
    Context context;

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

    @Override
    public int getCount() {
        return PAGE_COUNT;
    }

    @Override
    public Fragment getItem(int position) {
        return PageFragment.create(position + 1);
    }

    @Override
    public CharSequence getPageTitle(int position) {

        switch (position) {

        case 0:
            return context.getString(R.string.title1);

        case 1:
            return context.getString(R.string.title1);

        case 2:
            return context.getString(R.string.title1);
        }

        return null;
    }
}

14

根据你的错误信息,你请求的字符串ID不存在

可能是因为你支持多种语言,而且只有特定语言下才有这种字符串ID?

无论如何,这行代码:

String yourstring = getResources().getString(R.string.yourstring);

如何从资源中获取字符串。只要您在扩展Context的类中,例如Activity,就可以随时调用getResources()


12
无法访问getResources() - Karan Sharma

9

如果您正在尝试从活动外部访问字符串资源,则需要将上下文传递给该类(您已经声明过了),然后调用

String str = context.getResources().getString(R.string.some_string);

还要检查你的strings.xml文件,确保正确使用字符串ID。如果你正在使用Android Studio,你应该可以简单地开始输入R.string.,它将显示来自strings.xml文件的建议。如果在这里看不到你的资源,那么可能是你存储资源的方式有问题,而不是你尝试访问它们的方式有问题。


1

只需使用可用的getContext().getString(resId),例如:

getContext().getString(R.string.title1)

它对我有效。


1
您正在尝试在未获取资源的情况下从您的Resources中提取String。因此,请尝试使用Context通过getResources()获取Resources
如果您在ActivityService内部,则存在上下文。如果在外部,则请先使用getApplicationContext()获取Context,然后在其上获取资源,并在最后提取您的String
根据您的代码,如果正确获取resources和所述String id,这些片段不会抛出任何异常。
 public CharSequence getPageTitle(int position) 
  {
    switch (position) 
    {
    case 0:
           return getResources().getString(R.string.title1);
    case 1:
           return getResources().getString(R.string.title1);
    case 2:
           return getResources().getString(R.string.title1);
     }
    return null;
  }

0

尝试:

getApplicationContext().getResources().getString(R.String.title1);

0
如果在您的viewPager适配器中不允许调用getResources(),则需要将其声明为父活动中的静态变量。

0
根据我的经验,视图翻页器无法始终将每个文本显示在分配的屏幕上。我需要为每个页面创建单独的布局,并从布局内部分配文本,这样翻页时每个页面都会显示带有其文本的布局。

0

使用 Kotlin,我通过将上下文发送到适配器来执行此操作,如下所示:

class FmAdapter(val context: Context, fm: FragmentManager) : FragmentStatePagerAdapter(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) {

    private val fragments = arrayListOf<Fragments>()

    init {
        fragments.add(Fragments(R.string.title1, FragmentOne()))
        fragments.add(Fragments(R.string.title2, FragmentTwo()))
    }

    override fun getCount(): Int = fragments.size

    override fun getItem(position: Int): Fragment = fragments[position].fragment

    override fun getPageTitle(position: Int): CharSequence? = context.getString(fragments[position].title)
}

使用数据类:

data class Fragments(@StringRes val title: Int, val fragment: Fragment)

并且可以从活动中简单调用,例如:

rv.adapter = FmAdapter(this, supportFragmentManager)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接