2012-07-31 300 views
2

我正在使用FragmentPagerAdapter,我想用不同语言设置标题信息(“新闻,信息,帮助,Memebership” - 请参阅下面的代码)。问题是如何从res/values/strings.xml中读取标题?fragmentpageradapter中的多语言标题

有人可以帮助我吗?

感谢

汤姆

public class MainInfoViewPagerAdapter extends FragmentPagerAdapter implements PageIndicator 
{ 
private String[] titles= new String[] 
     {   
     "News",   
     "Information",   
     "Help", 
     "Membership" 
     }; 
public MainInfoViewPagerAdapter(FragmentManager fm) 
{ 
    super(fm); 
}   
+0

没有人知道吗? – 2012-08-17 08:35:21

回答

0

我管理它创建一个私人SparseArray<String> TITLES;,并在主要活动填补它的OnCreate中的功能,这样的事情:

TITLES = new SparseArray<String>(); 
    TITLES.put(KEY_FRAGMENT, 
      getResources().getString(R.string.subtitle_keys)); 
    TITLES.put(CERTIFICATE_FRAGMENT, 
      getResources().getString(R.string.subtitle_cert)); 
    TITLES.put(TRUST_NETWORK_FRAGMENT, 
      getResources().getString(R.string.subtitle_trust_network)); 
    TITLES.put(CRL_FRAGMENT, getResources() 
      .getString(R.string.subtitle_crl)); 
    TITLES.put(SECURE_FRAGMENT, 
      getResources().getString(R.string.subtitle_secure)); 
    TITLES.put(SETTINGS_FRAGMENT, 
      getResources().getString(R.string.subtitle_settings)); 

而且finaly在getTitle中的FragmentPagerAdapter做这样的事情:

@Override 
    public CharSequence getPageTitle(int position) { 
     switch (position) { 
     case 0: 
      // Fragment of the app is the Key Management. 
      return TITLES.get(position); 
     case 1: 
      // Fragment of the app is the Certificate Management. 
      return TITLES.get(position); 

     case 2: 
      // Fragment of the app is the Trust Network Management. 
      return TITLES.get(position); 

     case 3: 
      // Fragment of the app is the CRL Management. 
      return TITLES.get(position); 

     default: 
      return TITLES.get(position); 
     } 
    } 

也许它不是最好的方式,但它的一种方式!

+0

Hi Javier,在getTitle()的FragmentPagerAdapter中,“TITLES无法解析”。我能做什么?最好的问候汤姆 – 2012-09-02 20:15:05

+0

你是否创建FragmentPagerAdapter作为主Activity类的内部类rigth?如果这样做,只需将TITLES声明为主类的属性,以便内部类可以访问它。这是一个问题,但我会发布一个我已经测试过的应用程序的其他aproach。 – JavierSP1209 2012-09-04 04:09:39

0

你可以测试的另一个问题是这个。对于这个测试,我创建了一个带有制表符的活动,并且每次用户选择一个制表符时,操作栏中的字幕都会根据不同的语言(英文/西班牙文)进行更改。因此,进出口猜测你的活动结构是这样的:

MainActivity extends FragmentActivity 
- In this class you have one ViewPager and one PagerAdapter as attributes 
- PagerAdapter is a inner class inside MainActivity. 

的代码是这样的,首先主要活动:

public class TrustNetworkActivity extends FragmentActivity implements 
     ActionBar.TabListener { 
AppSectionsPagerAdapter mAppSectionsPagerAdapter; 
private SparseArray<String> TITLES; 
ViewPager mViewPager; 
/** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     DataBaseDictionary.PACKAGE_NAME = getApplicationContext() 
       .getPackageName(); 
     //Loads the data base 
     initDBLoader(this); 
     fillSubtitlesArray(); 
     // Create the adapter that will return a fragment for each of the three 
     // primary sections 
     // of the app. 
     mAppSectionsPagerAdapter = new AppSectionsPagerAdapter(
       getSupportFragmentManager()); 

     // Set up the action bar. 
     final ActionBar ab = getSupportActionBar(); 
     // ab.setDisplayHomeAsUpEnabled(Boolean.TRUE); 
     ab.setSubtitle(TITLES.get(KEY_FRAGMENT)); 
     ab.setDisplayShowTitleEnabled(true); 

     // Set up the ViewPager, attaching the adapter and setting up a listener 
     // for when the user swipes between sections. 
     mViewPager = (ViewPager) findViewById(R.id.pager); 
     mViewPager.setAdapter(mAppSectionsPagerAdapter); 
     mViewPager 
       .setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { 
        @Override 
        public void onPageSelected(int position) { 
         // When swiping between different app sections, select 
         // the corresponding tab. 
         // We can also use ActionBar.Tab#select() to do this if 
         // we have a reference to the 
         // Tab. 
         ab.setSubtitle(TITLES.get(position)); 
         ab.setSelectedNavigationItem(position); 
        } 
       }); 

     ab.addTab(ab.newTab().setText("").setIcon(R.drawable.ic_menu_keys) 
       .setTabListener(this)); 
     ab.addTab(ab.newTab().setText("").setIcon(R.drawable.ic_menu_cert) 
       .setTabListener(this)); 
     ab.addTab(ab.newTab().setText("") 
       .setIcon(R.drawable.ic_menu_trust_network).setTabListener(this)); 
     ab.addTab(ab.newTab().setText("").setIcon(R.drawable.ic_menu_crl) 
       .setTabListener(this)); 
ab.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 
} 

/** 
    * Fills the subtitle array with the resource strings, so it would be 
    * multilanguage 
    */ 
    private void fillSubtitlesArray() { 
     TITLES = new SparseArray<String>(); 
     TITLES.put(0, 
       getResources().getString(R.string.subtitle_keys)); 
     TITLES.put(1, 
       getResources().getString(R.string.subtitle_cert)); 
     TITLES.put(2, 
       getResources().getString(R.string.subtitle_trust_network)); 
     TITLES.put(3, getResources() 
       .getString(R.string.subtitle_crl)); 
     TITLES.put(4, 
       getResources().getString(R.string.subtitle_secure)); 
     TITLES.put(5, 
       getResources().getString(R.string.subtitle_settings)); 

    } 

正如你可以在OnPageChangeListener上ViewPager看,我有人称动作栏setSubtitle方法,因此,每次用户选择一个新的页面,我的行动吧字幕改变,则适配器:

/** 
* A {@link FragmentPagerAdapter} that returns a fragment corresponding to 
* one of the primary sections of the app. 
*/ 
public class AppSectionsPagerAdapter extends FragmentStatePagerAdapter { 

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

    @Override 
    public Fragment getItem(int i) { 
     switch (i) { 
     case 0: 
      // Fragment of the app 
      return new Fragment1(); 
     case 1: 
      // Fragment of the app 
      return new Fragment2(); 

     case 2: 
      // Fragment of the app 
      return new Fragment3(); 

     case 3: 
      // Fragment of the app 
      return new Fragment4(); 

     default: 
      return new Fragment5(); 
     } 
    } 

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

我希望这可以帮助你!

3

这是我如何解决它:

在适配器:

public class TitleAdapter extends FragmentPagerAdapter { 
    private String titles[]; 
    private Fragment frags[]; 

    public TitleAdapter(FragmentManager fm, Context context) { 
       super(fm); 

       Resources resources = context.getResources(); 
       titles = resources.getStringArray(R.array.titles); 

       frags = new Fragment[titles.length]; 

       frags[0] = new NewsFragment(); 
       frags[1] = new ArtistsFragment(); 
       frags[2] = new InfoFragment(); 
       frags[3] = new EatDrinkFragment(); 

     .... 

/values/arrays.xml是这样的:

<string-array name="titles"> 
     <item>NEWS</item> 
     <item>ARTISTS</item> 
     <item>INFORMATION</item> 
     <item>EAT AND DRiNK</item> 
    </string-array> 

如果你想的语言,只需添加另一个值文件夹(如/values-fr/strings.xml)作为法语。