如何在ViewPager适配器中获取String资源?

时间:2013-09-02 17:55:02

标签: android android-viewpager android-resources

我试图为我的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;
    }
}

logcat的:

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 个答案:

答案 0 :(得分:36)

您应该从活动的上下文中调用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;
    }
}

答案 1 :(得分:9)

好吧,根据您的错误消息,您没有要求提供ID 的字符串。

  

可能是您支持多种语言而且只有这个   特定语言的String-ID类型?

无论如何,这行代码:

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

是如何从Resources获取String。

答案 2 :(得分:4)

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

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

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

答案 3 :(得分:1)

只需使用可用的:undefined reference to `vtable for MyWidget' ........................................ collect2: error: ld returned 1 exit status make: *** [mywidget] Error 1 ,如:

getContext().getString(resId)

它对我有用。

答案 4 :(得分:1)

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

答案 5 :(得分:0)

您尝试在String内取Resources而未获得Resources。因此,请尝试使用ResourcesgetResources()Context一起提取。

如果您在ActivityService内,那么上下文就在那里。如果在外面,请尝试首先使用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;
  }

答案 6 :(得分:0)

尝试:

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

答案 7 :(得分:0)

根据我的经验,视图寻呼机不会一致地向指定的屏幕显示每个文本。我需要为每个页面创建单独的布局并从布局中分配文本,因此当翻页时,每个页面都会显示带有文本的布局。

答案 8 :(得分: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)