Подтвердить что ты не робот

Панель действий Android с двумя растянутыми кнопками

Кто-нибудь знает, как легко реализовать панель действий с двумя растянутыми кнопками?

Вот пример приложения календаря Google:

enter image description here

Спасибо!

4b9b3361

Ответ 1

Если вы предпочитаете это в ActionBar по какой-либо причине, одним из способов достижения этого является использование пользовательского представления на панели действий. Внутри интерфейса Custom View задайте вопрос о настройке ширины кнопок.

Указание активности на использование пользовательского представления для панели действий:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);   
    final ActionBar ab = getActionBar();
    ab.setDisplayShowHomeEnabled(false);
    ab.setDisplayShowTitleEnabled(false);     
    final LayoutInflater inflater = (LayoutInflater)getSystemService("layout_inflater");
    View view = inflater.inflate(R.layout.action_bar_edit_mode,null); 
    ab.setCustomView(view);
    ab.setDisplayShowCustomEnabled(true);
}

layout/action_bar_edit_mode.xml может выглядеть примерно так:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:gravity="fill_horizontal"
    android:orientation="horizontal" >
    <LinearLayout 
        android:layout_alignParentLeft="true"
        android:layout_width="fill_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal">

        <Button
        android:id="@+id/action_bar_button_cancel"
        android:layout_width="fill_parent"
        android:layout_height="match_parent"           
        android:layout_weight="1"
        android:text="Cancel" />

        <Button
        android:id="@+id/action_bar_button_ok"
        android:layout_width="fill_parent"
        android:layout_height="match_parent"           
        android:layout_weight="1"
        android:text="Ok" />
    </LinearLayout>    
</RelativeLayout>

Надеюсь, это поможет кому-то!

Примечание: Я понимаю уродливые макеты вложенности здесь, и обычно я бы не рекомендовал этого, но по какой-то причине собственный макет панели действий не позволяет LinearLayout самостоятельно использовать всю ширину. Обычно вам следует избегать разметки макетов без необходимости! Возможно, если кто-то это увидит, они могут указать нам на лучшее решение?

Как это выглядит: result

РЕДАКТИРОВАТЬ: Существует замечательный комментарий от Roman Nurik, где он объясняет, как сделать это очень красиво.

РЕДАКТИРОВАТЬ 2: Если кому-то интересно, правильный способ выложить кнопки, чтобы они расширяли ширину панели действий без необходимости встраивать макеты, как я делал выше, - это установить пользовательский вид с соответствующими параметрами макета, который позволяет его компоненту соответствовать родительской группе.

По существу:

actionBar.setCustomView(view,new ActionBar.LayoutParams(
        ViewGroup.LayoutParams.MATCH_PARENT,
        ViewGroup.LayoutParams.MATCH_PARENT));

Ответ 2

Я знаю 2 способа сделать это, но один не остается на вершине.

Вот 1-й:

Вам нужно переопределить метод onCreateOptionsMenu, но это добавление на ActionBar, для этого вам потребуется API 11, и когда вы поворачиваете экран, эти кнопки появляются на ActionBar, это зависит от экрана размер.

 @Override
 public void onCreateOptionsMenu(Menu menu, MenuInflater inflater)
 {
     MenuItem add = menu.add(Menu.NONE, ADD_TIME, 0, R.string.add_time);
     add.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);

     MenuItem qkAdd = menu.add(Menu.NONE, QUICK_ADD_TIME, 1, R.string.quick_add_time);
     qkAdd.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
 }

и это результат:

enter image description here

если вы используете Фрагмент, вам нужно установить setHasOptionsMenu на true, иначе меню не будет отображаться.

Вот второй:

cancel_done.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/color_bar"
android:orientation="horizontal" >

<LinearLayout
    android:layout_width="0dp"
    android:layout_height="match_parent"
    android:layout_weight="1"
    android:dividerPadding="12dp"
    android:orientation="vertical"
    android:showDividers="end" >

    <Button
        android:id="@+id/button1"
        style="@drawable/btn_cab_done_holo_light"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="center"
        android:background="@drawable/btn_cab_done_holo_light"
        android:text="CANCEL"
        android:textSize="14sp" />

</LinearLayout>

<LinearLayout
    android:layout_width="0dp"
    android:layout_height="match_parent"
    android:layout_weight="1"
    android:dividerPadding="12dp"
    android:orientation="vertical"
    android:showDividers="beginning" >

    <Button
        android:id="@+id/button2"
        style="@drawable/btn_cab_done_holo_light"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="center"
        android:background="@drawable/btn_cab_done_holo_light"
        android:text="DONE"
        android:textSize="14sp" />

</LinearLayout>
</LinearLayout>

стиль ресурса btn_cab_done_holo_light.xml можно найти на ..\sdk\platform\android - %%\data\res\drawable, а затем на вашем макете вы просто добавьте:

        <include
            android:layout_width="match_parent"
            android:layout_height="48dp"
            android:layout_gravity="fill"
            layout="@layout/cancel_done" />

и это результат:

enter image description here

Я не сейчас, если это лучший способ, но он работает.

Ответ 3

Сделайте горизонтальную LinearLayout с двумя кнопками. Затем установите каждую из их ширины на match_parent и android:layout_weight="0.5" (Каждая кнопка будет занимать 50% места).

EDIT:

Чтобы применить в качестве фона ActionBar:

(ActionBarSherlock) getSupportActionBar().setCustomView(R.layout.my_view);
(ActionBar) getActionBar().setCustomView(R.layout.my_view);