ActionBarSherlock setCustomView не работает в Android 3.2
Недавно я обновил приложение для использования ActionBarSherlock 4.1. Поскольку пользователи обновления, запускающие приложение в Honeycomb experiance, принудительно закрываются из-за исключения нулевого указателя при настройке пользовательского представления на панели действий.
Я добавляю пользовательский вид, содержащий два прядильника на панель действий, это работает на Android 4.0 и 4.1, но не работает над 3.2.
bar.setCustomView(R.layout.custom_action_bar);// spinners
actionBarViewHolder= new CustomActionBarViewHolder();
actionBarViewHolder.categorySpinner = (Spinner) findViewById(R.id.actionbar_catergory);
actionBarViewHolder.sortBySpinner = (Spinner) findViewById(R.id.actionbar_sortby);
На Android 3.2 прядильщики еще не найдены в 4.0 и 4.1, они видны, и все работает гладко.
Я не пробовал приложение на эмуляторе 3.0, но я вижу проблему.
Любые идеи, что может быть проблемой?
<LinearLayout android:id="@+id/linearLayout1"
android:layout_width="wrap_content" android:layout_height="match_parent"
android:gravity="center_vertical|center_horizontal"
android:layout_weight="0.5">
<TextView android:id="@+id/textView1" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:text="Category:" />
<Spinner android:id="@+id/actionbar_catergory"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:entries="@array/actionbar_spinner_catergory"
android:background="@drawable/spinner_background" />
</LinearLayout>
<LinearLayout android:id="@+id/linearLayout1"
android:layout_width="wrap_content" android:layout_height="match_parent"
android:gravity="center_vertical|center_horizontal"
android:layout_weight="0.5">
<TextView android:id="@+id/textView2" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:text="Sort By:" />
<Spinner android:id="@+id/actionbar_sortby"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:entries="@array/actionbar_spinner_sortby" android:background="@drawable/spinner_background" />
</LinearLayout>
Ответы
Ответ 1
Попробуйте это, его работоспособность на всех устройствах или вы можете проверить демо-код здесь
getSupportActionBar().setCustomView(R.layout.actionbar_top); // load your layout
getSupportActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
Изображения
![enter image description here]()
Ответ 2
Попробуйте следующее:
final View view = inflater.inflate(R.layout.custom_action_bar, null);
bar.setCustomView(view);// spinners
actionBarViewHolder= new CustomActionBarViewHolder();
actionBarViewHolder.categorySpinner = (Spinner) view.findViewById(R.id.actionbar_catergory);
actionBarViewHolder.sortBySpinner = (Spinner) view.findViewById(R.id.actionbar_sortby);
Ответ 3
Вот код, как я создаю пользовательскую панель действий с actiobBarSherlock
private void createCustomActionBar() {
List<SiteLink> links = new ArrayList<SiteLink>();
links.add(...)
LinksAdapter linkAdapter = new LinksAdapter(this, R.layout.external_link, links);
View customNav = LayoutInflater.from(this).inflate(R.layout.custom_show_action_bar, null);
IcsSpinner spinner = (IcsSpinner)customNav.findViewById(R.id.spinner);
spinner.setAdapter(linkAdapter);
ImageView refresh = (ImageView) customNav.findViewById(R.id.refresh);
refresh.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
...
}
});
ImageView settings = (ImageView) customNav.findViewById(R.id.settings);
settings.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
...
}
});
getSupportActionBar().setCustomView(customNav, new ActionBar.LayoutParams(Gravity.RIGHT));
getSupportActionBar().setDisplayShowCustomEnabled(true);
}
Адаптер
private static class LinksAdapter extends ArrayAdapter<SiteLink> {
private List<SiteLink> strings;
private Context context;
private LinksAdapter(Context context, int textViewResourceId, List<SiteLink> objects) {
super(context, textViewResourceId, objects);
this.strings = objects;
this.context = context;
}
@Override
public int getCount() {
if (strings == null) return 0;
return strings.size();
}
@Override
public SiteLink getItem(int position) {
return super.getItem(position);
}
// return views of drop down items
@Override
public View getDropDownView(int position, View convertView, ViewGroup parent) {
final SiteLink siteLink = strings.get(position);
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
// at 0 position show only icon
TextView site = (TextView) inflater.inflate(R.layout.external_link, null);
site.setText(siteLink.getName());
site.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse(siteLink.getUrl()));
context.startActivity(i);
}
});
return site;
}
// return header view of drop down
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
return inflater.inflate(R.layout.icon, null);
}
}
Разметка
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="right"
>
<com.actionbarsherlock.internal.widget.IcsSpinner
android:id="@+id/spinner"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:paddingRight="20dp"
android:layout_gravity="center"
/>
<ImageView android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:src="@drawable/ic_navigation_refresh"
android:paddingRight="20dp"
android:paddingLeft="10dp"
android:layout_gravity="center"
android:background="@drawable/action_buttons_background"
android:id="@+id/refresh"/>
<ImageView android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:src="@drawable/ic_action_settings"
android:paddingRight="20dp"
android:background="@drawable/action_buttons_background"
android:layout_gravity="center"
android:id="@+id/settings"/>
</LinearLayout>
Ответ 4
Вы пытались поставить своих двух детей LinearLayout
внутри основного LinearLayout
?. Также попробуйте не повторять идентификатор от детей LinearLayout
, потому что вы заставляете вашу систему id плакать. Но я почти уверен, что ваша проблема заключается в том, что у вас есть несколько основных макетов в файле XML.
Ответ 5
Используйте приведенный ниже код для setCustomView, используя actionbarsherlib.
Он также работает в версии Android 3.2.
getSupportActionBar().setDisplayShowCustomEnabled(true);
View view = getLayoutInflater().inflate(R.layout.custom_view, null);
Button mybutton = (Button)view.findViewById(R.id.button1);
mybutton.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
/** Your click actions here. */
}
});
getSupportActionBar().setCustomView(view);
Ответ 6
Это мой код. Я добавил в библиотеку библиотеку Шерлока. Затем я использовал здесь для установки моего заголовка в заголовке (сверху). как это..
просто попробуйте это как... Установите целевой SDK на Android 3.2 (версия 14) или выше..
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
getSupportActionBar().setCustomView(R.layout.header_sherlock_xmllayout);
header_tvleft = (TextView) findViewById(R.id.header_tvleft);
header_tvleft.setText("Back");
попробуйте этот метод....