web-dev-qa-db-ja.com

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)
12
user2740699

まあ、あなたのエラーメッセージによるとIDの文字列がありません要求しています。

多言語をサポートしていて、特定の言語に対してのみこの種の文字列IDがあるのでしょうか?

とにかく、次のコード行:

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

リソースから文字列を取得する方法です。

10
Philipp Jahoda

アクティビティのコンテキストから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;
    }
}
38
Ali AlNoaimi

アクティビティの外部から文字列リソースにアクセスしようとしている場合は、そのクラスにコンテキストを渡し(既に行ったと述べた)、次に呼び出す必要があります。

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

また、strings.xmlファイルを使用して、文字列IDを正しく使用していることを確認します。 Android studioを使用している場合は、単にR.string.とすると、strings.xmlファイルからの提案が表示されます。ここにリソースが表示されない場合は、リソースへのアクセス方法ではなく、リソースの保存方法に問題がある可能性があります。

4

次のものを使用して、使用可能なものを使用してください:getContext().getString(resId) like:

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

それは私のために働いた。

1

試してください:

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

ViewPagerアダプターでgetResources()の呼び出しが許可されていない場合は、親アクティビティで静的変数として宣言する必要があります

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)
0
Gilbert Arafat

私の経験では、ビューページャーは割り当てられた画面に各テキストを一貫して表示しません。ページごとに個別のレイアウトを作成し、レイアウト内からテキストを割り当てる必要があったので、ページをめくると、各ページにテキストのあるレイアウトが表示されます。

0
fullMoon

Stringを取得せずにResources内でResourcesをフェッチしようとしています。 ResourcesContextgetResources()でプルしてみてください。

あなたがActivityまたはServiceの中にいる場合、コンテキストはそこにあります。外部の場合は、最初にContextgetApplicationContext()でプルし、その上でリソースをプルして、最後に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
Vikalp Patel