15

我试图为我的查看器设置标题,我似乎无法让它工作。我试过 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)
4

9 回答 9

44

您应该从活动的上下文中调用 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;
    }
}
于 2013-09-02T18:04:05.137 回答
14

好吧,根据您的错误消息,您没有带有您请求的 ID 的字符串。

会不会是您支持多种语言并且只有特定语言的这种 String-ID?

无论如何,这行代码:

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

是如何从资源中获取字符串。getResources()每当您在扩展类中时都可以调用Context,例如Activity.

于 2013-09-02T18:00:58.263 回答
7

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

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

还要检查您的strings.xml文件以确保您正确使用了字符串 id。如果您使用的是 android studio,您应该能够简单地开始输入R.string.,然后它会显示来自 strings.xml 文件的建议。如果您在此处看不到您的资源,那么这可能表明您存储资源的方式存在问题,而不是您尝试访问它们的方式。

于 2013-09-03T03:22:48.850 回答
1

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

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

它对我有用。

于 2016-07-21T16:50:31.913 回答
0

您正试图在没有获得的情况下获取String您的内部。所以试着用你的.ResourcesResourcesResourcesgetResources()Context

如果你在里面Activity,或者Service上下文就在那里。如果在外面,然后尝试先拉动Context,然后再getApplicationContext()拉动资源,最后拉动你的资源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;
  }
于 2013-09-02T18:03:01.913 回答
0

以我的经验,视图寻呼机不会一致地将每个文本显示到分配的屏幕上。我需要为每个页面创建单独的布局并从布局中分配文本,因此在翻转页面时,每个页面都会显示带有文本的布局。

于 2013-09-02T19:26:31.790 回答
0

尝试 :

getApplicationContext().getResources().getString(R.String.title1);
于 2013-09-02T18:08:29.190 回答
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)
于 2019-08-13T08:45:38.240 回答
0

如果不允许在你的viewPager Adapter中调用getResources(),你需要在父activity中声明为静态变量

于 2019-04-01T21:42:22.763 回答