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.