1

Мое приложение достаточно прогрессивно, чтобы начать тестировать его на различных устройствах. Теперь я хотел бы, чтобы пользователи sub 3.0 могли использовать мое приложение. Конечно, я использую библиотеку совместимости со стандартной панелью действий, которая, очевидно, сбой приложения, как только она начнется, когда версия SDK будет 10 или ниже, как и ожидалось. Я понимаю, что я мог бы использовать библиотеку ABS, но моя забота - настраиваемый ViewPager и TabAdapter. Вот код:ActionBar на устройствах sub3.0 - реализация ActionBarSherlock с моей настраиваемой системой?

public class Polling extends FragmentActivity { 
    private ViewPager mViewPager; 
    private TabsAdapter mTabsAdapter; 

    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     //sharedPreferences = getPreferences(MODE_PRIVATE); 
     mViewPager = new ViewPager(this); 
     mViewPager.setId(R.id.pager); 
     setContentView(mViewPager); 
     final ActionBar bar = getActionBar(); 
     bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 
     bar.setDisplayShowTitleEnabled(false); 
     bar.setDisplayShowHomeEnabled(false); 

     mTabsAdapter = new TabsAdapter(this, mViewPager); 
     mTabsAdapter.addTab(bar.newTab().setText(R.string.login), 
       LoginFragment.class, null); 
     mTabsAdapter.addTab(bar.newTab().setText(R.string.economics), 
       EconFragment.class, null); 
     mTabsAdapter.addTab(bar.newTab().setText(R.string.elections), 
       ElectionsFragment.class, null); 
     mTabsAdapter.addTab(bar.newTab().setText(R.string.politics), 
       PoliticsFragment.class, null); 
     mTabsAdapter.addTab(bar.newTab().setText(R.string.science), 
       ScienceFragment.class, null); 
     mTabsAdapter.addTab(bar.newTab().setText(R.string.finance), 
       FinanceFragment.class, null); 
     mTabsAdapter.addTab(bar.newTab().setText(R.string.religion), 
       ReligionFragment.class, null); 
     mTabsAdapter.addTab(bar.newTab().setText(R.string.military), 
       MilitaryFragment.class, null); 
     mTabsAdapter.addTab(bar.newTab().setText(R.string.international), 
       InternationalFragment.class, null); 


    } 

public static class TabsAdapter extends FragmentPagerAdapter 
    implements ActionBar.TabListener, ViewPager.OnPageChangeListener { 
     private final Context mContext; 
     private final ActionBar mActionBar; 
     private final ViewPager mViewPager; 
     private final ArrayList<TabInfo> mTabs = new ArrayList<TabInfo>(); 

     static final class TabInfo { 
      private final Class<?> clss; 
      private final Bundle args; 

      TabInfo(Class<?> _class, Bundle _args) { 
       clss = _class; 
       args = _args; 
      } 
     } 

     public TabsAdapter(FragmentActivity activity, ViewPager pager) { 
      super(activity.getSupportFragmentManager()); 
      mContext = activity; 
      mActionBar = activity.getActionBar(); 
      mViewPager = pager; 
      mViewPager.setAdapter(this); 
      mViewPager.setOnPageChangeListener(this); 
     } 

     public void addTab(ActionBar.Tab tab, Class<?> clss, Bundle args) { 
      TabInfo info = new TabInfo(clss, args); 
      tab.setTag(info); 
      tab.setTabListener(this); 
      mTabs.add(info); 
      mActionBar.addTab(tab); 
      notifyDataSetChanged(); 
     } 


     public int getCount() { 
      return mTabs.size(); 
     } 

     public Fragment getItem(int position) { 
      TabInfo info = mTabs.get(position); 
      return Fragment.instantiate(mContext, info.clss.getName(), info.args); 
     } 


     public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { 
     } 


     public void onPageSelected(int position) { 
      mActionBar.setSelectedNavigationItem(position); 
     } 


     public void onPageScrollStateChanged(int state) { 
     } 


     public void onTabSelected(Tab tab, FragmentTransaction ft) { 
      mViewPager.setCurrentItem(tab.getPosition()); 
      Log.v(TAG, "clicked"); 
      Object tag = tab.getTag(); 
      for (int i=0; i<mTabs.size(); i++) { 
       if (mTabs.get(i) == tag) { 
        mViewPager.setCurrentItem(i); 
       } 
      } 
     } 

     public void onTabUnselected(Tab tab, FragmentTransaction ft) {} 

     public void onTabReselected(Tab tab, FragmentTransaction ft) {} 

     public void onTabReselected(Tab tab, android.app.FragmentTransaction ft) {} 

     @Override 
     public void onTabSelected(Tab tab, android.app.FragmentTransaction ft) {  
      Object tag = tab.getTag(); 
      for (int i=0; i<mTabs.size(); i++) { 
       if (mTabs.get(i) == tag) { 
        mViewPager.setCurrentItem(i); 
       } 
      } 
     } 

     public void onTabUnselected(Tab tab, android.app.FragmentTransaction ft) {} 
    } 

Должен ли я просто говорить о совместимости с обратной стороной назад? Я имею в виду, что это много потенциальных установок, которые я теряю, говоря, что вы не можете использовать приложение, если это пряник или ниже.

ответ

2

С помощью ActionBarSherlock вы можете поддерживать Android 2.1 и новее с чрезвычайно простой заменой в коде.

  1. Изменение getActionBar в getSupportActionBar
  2. Изменить весь импорт меню, связанные с использованием com.actionbarsherlock.view.*, а не android.view.*.
  3. Изменить все связанные с фрагментом импорт, чтобы использовать android.support.v4.app.*, а не android.app.*.
  4. Номер SherlockFragmentActivity, а не Activity.
  5. Используйте Theme.Sherlock (или другую тему ABS) в своем манифесте.

Это должно быть все, что необходимо для создания функционирующего приложения, которое выглядит одинаково на всех платформах!

Если вам нужна дополнительная помощь, не забудьте проверить следующие ресурсы:

2

Поскольку большинство телефонов используют Android 2.3.x или ниже, я бы сказал, что вы неоправданно опускаете свою потенциальную аудиторию. Для вашего пользовательского ViewPager и TabAdapter просто расширьте тот, который предоставляется ABS, и вы должны быть в порядке.

Смежные вопросы