2013-07-11 3 views
0

Я нашел этот вопрос (Android 2.2 Spinner looks old in Actionbar), и я попробовал, но он не работает для меня! Я хочу создать Spinner в моей панели действий Sherlock, но он выглядит старым в более низких версиях Android. Это мой код:Шерлок actionbar spinner выглядит «старым» в более низких версиях Android

OnCreate:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_list); 
    getSupportActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_LIST); 
} 

Oncreateoptionsmenu:

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 


    MenuInflater mi = getSupportMenuInflater(); 
    mi.inflate(R.menu.list, menu); 

    final Spinner spinner = new Spinner(getSupportActionBar() 
    .getThemedContext()); 


    ArrayAdapter<String> adapter = new ArrayAdapter<String>(getSupportActionBar().getThemedContext(), 
    R.layout.sherlock_spinner_item, new String[]{"Level 1", "Level 2", "Level 3"}); 
    adapter.setDropDownViewResource(R.layout.sherlock_spinner_dropdown_item); 
    spinner.setAdapter(adapter); 

    spinner.setOnItemSelectedListener(new OnItemSelectedListener() { 

     @Override 
     public void onItemSelected(AdapterView<?> arg0, View arg1, 
     int arg2, long arg3) { 
      // clicked 

     } 

     @Override 
     public void onNothingSelected(AdapterView<?> arg0) { 
      // TODO Auto-generated method stub 

     } 
    }); 

    menu.add("Level").setActionView(spinner) 
    .setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); 

    return true; 
} 

ответ

4

Это потому, что Spinnerявляется старый, и ActionBarSherlock не влияет на поведение Spinner.

Если вместо вашего кода вы используете setNavigationMode(ActionBar.NAVIGATION_MODE_LIST), вы получите раскрывающийся список, который, вероятно, выглядит так, как вы хотите ... но это не Spinner. Скорее, это backport, называемый IcsSpinner, который является частью внутренней реализации ActionBarSherlock. IcsSpinner не является частью API API AFAIK ActionBarSherlock, хотя, если вы соскучитесь, вы обнаружите, что некоторые люди рассматривают его как таковые в любом случае (рискуя сломать свои приложения, если Джейк Уортон изменит IcsSpinner).

Либо:

  • Использование setNavigationMode(ActionBar.NAVIGATION_MODE_LIST) или

  • Попробуйте поддерживаемую Backport голо тематикой виджетов, таких как HoloEverywhere или

  • Вытащите ActionBarSherlock-х IcsSpinner в свой собственный код чтобы вы могли сохранить свою копию независимо от изменений, внесенных в ActionBarSherlock, или

  • Использование ActionBarSherlock собственного IcsSpinner напрямую, несмотря на риски, или

  • Живая со старым выглядеть и чувствовать себя на старых устройствах, или

  • Не используйте выпадающий список в панели действий на более старые устройства

+0

«Использовать собственный IcsSpinner ActionBarSherlock непосредственно, несмотря на риски, или« => какие риски? –

+1

@BartWesselink: Как я писал, 'IcsSpinner' не является частью общедоступного API ActionBarSherlock, о чем свидетельствует' internal' как часть его имени пакета. Джейк мог перенести его в новый пакет или переименовать его, полностью избавиться от него, изменить поддерживаемые атрибуты, изменить общедоступный Java API или иным образом связать с ним. Такие изменения полностью соответствуют его правам, так как «IcsSpinner» - это реализация, а не интерфейс. Тем не менее, эти изменения могут сильно нарушить * you * (и все остальные, непосредственно используя 'IcsSpinner'). – CommonsWare

+0

Спасибо за ответы, это мне очень помогает! –