Come visualizzare la visualizzazione personalizzata in ActionBar?


92

Voglio visualizzare la ricerca personalizzata nella barra delle azioni (sto usando ActionBarSherlock per quello).

Ho capito:

inserisci qui la descrizione dell'immagine

Ma voglio creare un layout personalizzato (campo testo) per occupare l'intera larghezza disponibile.

Ho implementato il layout personalizzato come suggerito qui .

C'è il mio layout personalizzato search.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    style="?attr/actionButtonStyle"
    android:layout_width="fill_parent"
    android:layout_height="match_parent"
    android:layout_gravity="fill_horizontal"
    android:focusable="true" >

    <FrameLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical|fill_horizontal" >

        <EditText
            android:id="@+id/search_query"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="left|center"
            android:background="@drawable/bg_search_edit_text"
            android:imeOptions="actionSearch"
            android:inputType="text" />

        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="right|center_vertical"
            android:src="@drawable/ic_search_arrow" />

    </FrameLayout>

</LinearLayout>

E in MyActivity:

ActionBar actionBar = getSupportActionBar();
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setDisplayShowCustomEnabled(true);
actionBar.setDisplayShowTitleEnabled(false);
actionBar.setIcon(R.drawable.ic_action_search);

LayoutInflater inflator = (LayoutInflater) this .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View v = inflator.inflate(R.layout.search, null);

actionBar.setCustomView(v);

Come posso creare un layout personalizzato per occupare tutta la larghezza disponibile actionBar?

Aiuto per favore.


Sei in grado di impostare il titolo con il set di visualizzazione personalizzato?
— Roy Lee

Risposte:


95

C'è un trucco per questo. Tutto quello che devi fare è usare RelativeLayoutinvece che LinearLayoutcome contenitore principale. È importante essersi android:layout_gravity="fill_horizontal"preparati. Dovrebbe bastare.


3
@ Tomik Potresti dare un'occhiata al mio scenario? stackoverflow.com/questions/16516306/… Ho un titolo mancante dopo l'impostazione della visualizzazione personalizzata.
— Roy Lee

36

Ho lottato con questo me stesso e ho provato la risposta di Tomik. Tuttavia, questo non ha reso il layout alla massima larghezza disponibile all'inizio, solo quando aggiungi qualcosa alla vista.

Dovrai impostare LayoutParams.FILL_PARENTquando aggiungi la vista:

//I'm using actionbarsherlock, but it's the same.
LayoutParams layout = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
getSupportActionBar().setCustomView(overlay, layout); 

In questo modo riempie completamente lo spazio disponibile. (Potrebbe essere necessario utilizzare anche la soluzione di Tomik).


2
+1, in realtà, ha funzionato solo per me dopo aver aggiunto LayoutParams, grazie
— Mahmoud Badri

1
qual è il valore di sovrapposizione?
— androidevil

2
@androidery è la tua visualizzazione personalizzata. O gonfiato da xml o creato nel codice.
— Bilthon

8

Ecco come ha funzionato per me (dalle risposte precedenti mostrava sia il titolo predefinito che la mia visualizzazione personalizzata).

ActionBar.LayoutParams layout = new ActionBar.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
// actionBar.setCustomView(view); //last view item must set to android:layout_alignParentRight="true" if few views are there 
actionBar.setCustomView(view, layout); // layout param width=fill/match parent
actionBar.setDisplayShowCustomEnabled(true);//must other wise its not showing custom view.

Quello che ho notato è che entrambi setCustomView(view)e setCustomView(view,params)la larghezza della vista = corrispondenza / riempimento genitore. setDisplayShowCustomEnabled (booleano showCustom)


6

Le risposte di Tomik e Peterdk funzionano quando si desidera che la visualizzazione personalizzata occupi l'intera barra delle azioni, nascondendo anche il titolo nativo.

Ma se vuoi che la tua visualizzazione personalizzata viva fianco a fianco con il titolo (e riempia tutto lo spazio rimanente dopo che il titolo è stato visualizzato), allora posso farti riferimento all'eccellente risposta dell'utente Android-Developer qui:

https://stackoverflow.com/a/16517395/614880

Il suo codice in fondo ha funzionato perfettamente per me.


3

Ad esempio, è possibile definire un file di layout che contiene un elemento EditText.

<?xml version="1.0" encoding="utf-8"?>
<EditText xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/searchfield"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:inputType="textFilter" >

</EditText> 

tu puoi fare

public class MainActivity extends Activity {

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    ActionBar actionBar = getActionBar();
    // add the custom view to the action bar
    actionBar.setCustomView(R.layout.actionbar_view);
    EditText search = (EditText) actionBar.getCustomView().findViewById(R.id.searchfield);
    search.setOnEditorActionListener(new OnEditorActionListener() {

      @Override
      public boolean onEditorAction(TextView v, int actionId,
          KeyEvent event) {
        Toast.makeText(MainActivity.this, "Search triggered",
            Toast.LENGTH_LONG).show();
        return false;
      }
    });
    actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM
        | ActionBar.DISPLAY_SHOW_HOME);


    }

mi ha salvato n ore .. Grazie
— CrazyMind

1

C'è un esempio nell'app launcher di Android (di cui ho ricavato una libreria, qui), all'interno della classe che gestisce la selezione degli sfondi ("WallpaperPickerActivity").

L'esempio mostra che è necessario impostare un tema personalizzato affinché funzioni. Purtroppo, questo ha funzionato per me solo utilizzando il framework normale e non quello della libreria di supporto.

Ecco i temi:

styles.xml

 <style name="Theme.WallpaperPicker" parent="Theme.WallpaperCropper">
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:colorBackgroundCacheHint">@null</item>
    <item name="android:windowShowWallpaper">true</item>
  </style>

  <style name="Theme.WallpaperCropper" parent="@android:style/Theme.DeviceDefault">
    <item name="android:actionBarStyle">@style/WallpaperCropperActionBar</item>
    <item name="android:windowFullscreen">true</item>
    <item name="android:windowActionBarOverlay">true</item>
  </style>

  <style name="WallpaperCropperActionBar" parent="@android:style/Widget.DeviceDefault.ActionBar">
    <item name="android:displayOptions">showCustom</item>
    <item name="android:background">#88000000</item>
  </style>

valore-v19 / styles.xml

 <style name="Theme.WallpaperCropper" parent="@android:style/Theme.DeviceDefault">
    <item name="android:actionBarStyle">@style/WallpaperCropperActionBar</item>
    <item name="android:windowFullscreen">true</item>
    <item name="android:windowActionBarOverlay">true</item>
    <item name="android:windowTranslucentNavigation">true</item>
  </style>

  <style name="Theme" parent="@android:style/Theme.DeviceDefault.Wallpaper.NoTitleBar">
    <item name="android:windowTranslucentStatus">true</item>
    <item name="android:windowTranslucentNavigation">true</item>
  </style>

EDIT: c'è un modo migliore per farlo, che funziona anche sulla libreria di supporto. Basta aggiungere questa riga di codice invece di quello che ho scritto sopra:

getSupportActionBar().setDisplayShowCustomEnabled(true);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.