我试图为我的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)
答案 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
。因此,请尝试使用Resources
将getResources()
与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;
}
答案 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)