2013-10-24 5 views
0

я в настоящее время меняется взгляд на мой ActionBarMenuItem так:Изменение андроида ActionBar кнопки стиль

MenuItem menuItem = menu.add(title); 

TextView tv = new TextView(context); 
tv.setTypeface(myTypeface); 
tv.setText("hello"); 

menuItem.setActionView(tv); 

Однако это отключена функция кнопки, которую я предполагаю, что это потому, что я изменил ActionView. В любом случае, я могу это сделать, сохраняя функцию кнопки?

ответ

7

Вот пример создания пользовательского MenuItem для ActionBar.

Первый: Создайте View, который будет служить вашим MenuItem.

ActionLayoutExample

/** 
* A {@link RelativeLayout} that serves as a custom {@link MenuItem} 
*/ 
public class ActionLayoutExample extends RelativeLayout { 

    /** The MenuItem */ 
    private TextView mHello; 

    /** 
    * Constructor for <code>ActionLayoutExample</code> 
    * 
    * @param context The {@link Context} to use 
    * @param attrs The attributes of the XML tag that is inflating the view 
    */ 
    public ActionLayoutExample(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     // Ensure the MenuItem is accessible 
     CheatSheet.setup(this); 
    } 

    /** 
    * {@inheritDoc} 
    */ 
    @Override 
    protected void onFinishInflate() { 
     super.onFinishInflate(); 
     // Initialize the TextView 
     mHello = (TextView) findViewById(android.R.id.text1); 
     mHello.setTypeface(myTypeface); 
     mHello.setText("Hello"); 
    } 

} 

Второй: Создать макет, который вы на самом деле применить к MenuItem.

action_layout_example

<your.package.name.ActionLayoutExample xmlns:android="http://schemas.android.com/apk/res/android" 
    style="?android:attr/actionButtonStyle" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:background="?android:attr/selectableItemBackground" 
    android:clickable="true" 
    android:contentDescription="@string/hello_world" > 

    <TextView 
     android:id="@android:id/text1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" /> 

</your.package.name.ActionLayoutExample> 

Это важно включить стиль style="?android:attr/actionButtonStyle", чтобы убедиться, что расположение правильно отражает ActionBar элементы. Также важно включить в ваш макет android:contentDescription. Обычно, когда вы долго нажимаете MenuItem со значком, отображается всплывающая подсказка, указывающая, для чего это MenuItem. В вашем случае вам нужно сделать дополнительный шаг, чтобы убедиться, что эта всплывающая подсказка все еще доступна.

Отличный помощник для этого является Roman Nurik's CheatSheet. Вы можете увидеть, как я использую его в конструкторе макета действия.

Вы специально задали вопрос о выборе MenuItem. Для этого обязательно укажите атрибуты android:background="?android:attr/selectableItemBackground" и android:clickable="true".

Третий: Используйте атрибут android:actionLayout, чтобы установить расположение и надуть меню обычно в пределах своего Activity или Fragment.

your_menu

<item 
    android:id="@+id/action_typeface" 
    android:actionLayout="@layout/action_layout_example" 
    android:showAsAction="ifRoom" 
    android:title="@string/hello_world"/> 

Использование MenuItem

В onCreateOptionsMenu вызова MenuItem.getActionView и View.onClickListener.Это происходит потому, что onOptionsItemSelected не будет вызываться для пользовательского View

final View example = menu.findItem(R.id.action_typeface).getActionView(); 
example .setOnClickListener(new OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     // Do something 
    } 
}); 

Результаты

enter image description here

+0

спасибо, я попробую это –

+0

Я забыл упомянуть, что вам нужно позвонить 'MenuItem.getActionView', чтобы на самом деле его использовать. Извините, я обновил свой ответ. На самом деле, я думаю, это то, что вы искали все это время. Наверное, я дал вам более длинный ответ, чем вы рассчитывали. – adneal

+0

Отличный ответ, спасибо! –

0

попробовать это

tv.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       //handle 
      } 
     }); 
+0

я думаю, я попытался это уже, я буду делать это снова и подтвердить. спасибо, хотя –

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