Sherlock actionbar spinner在较低的Android版本中看起来'旧'
我发现这个问题(Android 2.2 Spinner looks old in Actionbar),我试过了,但它不适合我!我想在我的Sherlock Actionbar中创建一个Spinner,但在较低的Android版本中看起来很老。这是我的代码:Sherlock 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;
}
这是因为Spinner
是老了,ActionBarSherlock不影响Spinner
行为。
如果使用setNavigationMode(ActionBar.NAVIGATION_MODE_LIST)
代替代码,您将得到一个可能看起来像您想要的方式的下拉列表......但这不是Spinner
。相反,这是一个名为IcsSpinner
的backport,它是ActionBarSherlock内部实现的一部分。 IcsSpinner
不是ActionBarSherlock公共API AFAIK的一部分,但是如果你捅了你一下,你会发现一些人把它当作是这样(如果杰克沃顿改变了IcsSpinner
,运行其应用程序的风险就会中断)。
或者:
使用
setNavigationMode(ActionBar.NAVIGATION_MODE_LIST)
,或者尝试全息为主题的小部件,如HoloEverywhere的支持后向移植,或
拉出ActionBarSherlock的
IcsSpinner
到你自己的代码以便您可以独立于对ActionBarSherlock所做的更改来维护您的副本,或者可以保留您的副本,或者使用ActionBarSherlock自己
IcsSpinner
直接,但存在风险,或直播与旧的外观和感觉上较旧的设备,或
在你的动作条上不要使用下拉列表旧设备
“直接使用ActionBarSherlock自己的IcsSpinner,尽管存在风险,或者”=>有哪些风险? –
@BartWesselink:正如我写的,“IcsSpinner”不是ActionBarSherlock公共API的一部分,正如“internal”作为其包名称的一部分所证明的那样。 Jake可以将它移动到一个新的包中,或重新命名它,完全清除它,更改支持的属性,更改公共Java API或以其他方式混淆它。这样的改变完全在他的权限之内,因为'IcsSpinner'是实现的,而不是接口。但是,这些更改很可能会破坏你*(以及任何直接使用'IcsSpinner'的人)。 – CommonsWare
感谢您的回答,这对我有很大帮助! –