2012-06-29 11 views
22

Qualcuno sa come implementare facilmente una barra delle azioni con due pulsanti allungati?Barra di azione Android con due pulsanti allungati

Ecco un esempio del calendario app di Google:

enter image description here

Grazie!

+0

Questa non è la barra delle azioni ... sembra più un widget a discesa di qualche tipo. –

+0

Sono abbastanza sicuro che lo sia. –

+0

possibile duplicato di [Annulla pulsanti Done nell'app Calendario: fa parte della barra delle azioni?] (Http://stackoverflow.com/questions/15103895/cancel-done-buttons-in-calendar-app-is-it-part -della action bar) –

risposta

38

Se invece si dispone di questo nel ActionBar per qualsiasi motivo, un modo per raggiungere questo obiettivo è quello di utilizzare una visualizzazione personalizzata in azione bar. All'interno del layout della visualizzazione personalizzata, quindi, preoccuparsi di impostare la larghezza dei pulsanti.

Raccontare l'attività di utilizzare una visualizzazione personalizzata per la barra delle operazioni:

@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 può quindi essere simile:

<?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> 

Speranza che aiuta qualcuno!

Nota: mi rendo conto i layout di nidificazione brutti qui e normalmente io non consiglierei questo, ma per qualche ragione proprio layout del ActionBar rifiuta di lasciare il LinearLayout occupa l'intera larghezza da solo. Normalmente si dovrebbe evitare inutilmente layout di annidamento come questo! Forse se qualcuno lo vede può indicarci una soluzione migliore?

quello che sembra: result

EDIT: C'è un excellent post di Roman Nurik dove spiega un modo per farlo molto bene.

EDIT 2: Se qualcuno è curioso, il modo corretto per disporre i pulsanti in modo da ampliare la larghezza del ActionBar senza la necessità di nido i layout come ho fatto in precedenza, è quello di impostare la visualizzazione personalizzata con i parametri di layout corretti che consentono al componente di corrispondere al gruppo principale.

In sostanza:

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

Utilizzare una vista personalizzata in questo modo (con un layout relativo allungato) ha il brutto effetto collaterale di nascondere il menu di overflow che normalmente viene visualizzato per alcuni dispositivi . – Nariman

+0

Non è davvero un brutto effetto collaterale, questo è in realtà l'effetto desiderato in questo caso. Se vuoi che l'overflow mostri ancora che potresti voler seguire ciò che fa l'app dei contatti (o "DoneButtonActivity sul progetto di Nurik di Roma) e allineare i pulsanti a sinistra per consentire di visualizzare l'overflow. Opzionalmente puoi impostare la tua attività con barra di azione divisa in modo che l'overflow sia visualizzato in basso. –

3

Creare un LinearLayout orizzontale con due pulsanti. Quindi imposta ciascuna delle loro larghezze su match_parent e android:layout_weight="0.5" (Ogni pulsante occuperà il 50% dello spazio).

EDIT:

Per applicare come ActionBar sfondo:

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

Come applicare questo LinearLayout all'ActionBar? –

+0

Il mio suggerimento non avrebbe usato l'ActionBar; comporta la creazione manuale del proprio 'ActionBar' utilizzando un LinearLayout con 2 pulsanti e layout_weight – Guardanis

+0

Bene, ok, non sembra essere disponibile una soluzione migliore. –

5

so 2 modi per farlo, ma non si rimanere in cima.

Ecco la prima:

È necessario eseguire l'override del metodo onCreateOptionsMenu, ma questo è aggiungere sul ActionBar, è necessario API 11 per fare questo e quando si ruota lo schermo questo pulsanti appaiono sul ActionBar, questo dipende dalla dimensione dello schermo.

@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); 
} 

e questo è il risultato:

enter image description here

se si sta utilizzando un Frammento è necessario impostare setHasOptionsMenu a vero, altrimenti il ​​menu Mostra solito.

Ecco la seconda:

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> 

lo stile risorsa btn_cab_done_holo_light.xml si possono trovare sul .. \ SDK \ piattaforme \ android - %% \ Data \ res \ drawable e poi su il layout si aggiunge solo:

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

e questo è il risultato:

enter image description here

Non so se è il modo migliore, ma funziona.

Problemi correlati