Wie zeige ich eine benutzerdefinierte Ansicht in ActionBar an?


92

Ich möchte eine benutzerdefinierte Suche in der Aktionsleiste anzeigen (ich verwende dafür ActionBarSherlock).

Ich habe das verstanden:

Geben Sie hier die Bildbeschreibung ein

Ich möchte jedoch ein benutzerdefiniertes Layout (Feld edittext) erstellen, das die gesamte verfügbare Breite einnimmt.

Ich habe ein benutzerdefiniertes Layout implementiert, wie hier vorgeschlagen .

Es gibt mein benutzerdefiniertes Layout 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>

Und 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);

Wie kann ich ein benutzerdefiniertes Layout erstellen, um die gesamte verfügbare Breite von zu belegen actionBar?

Hilfe bitte.


Können Sie den Titel mit einer benutzerdefinierten Ansicht festlegen?
Roy Lee

Antworten:


95

Dafür gibt es einen Trick. Alles, was Sie tun müssen, ist, RelativeLayoutanstatt LinearLayoutals Hauptcontainer zu verwenden. Es ist wichtig, sich darauf android:layout_gravity="fill_horizontal"eingestellt zu haben. Das sollte es tun.


3
@ Tomik Könnten Sie sich bitte mein Szenario ansehen? stackoverflow.com/questions/16516306/… Ich habe einen fehlenden Titel, nachdem die benutzerdefinierte Ansicht festgelegt wurde.
Roy Lee

36

Ich kämpfte selbst damit und versuchte es mit Tomiks Antwort. Dadurch wurde das Layout jedoch beim Start nicht auf die volle verfügbare Breite gebracht, nur wenn Sie der Ansicht etwas hinzufügen.

Sie müssen Folgendes festlegen, LayoutParams.FILL_PARENTwenn Sie die Ansicht hinzufügen:

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

Auf diese Weise wird der verfügbare Platz vollständig ausgefüllt. (Möglicherweise müssen Sie auch die Tomik-Lösung verwenden.)


2
+1, eigentlich hat es nur für mich funktioniert, nachdem ich die LayoutParams hinzugefügt habe, danke
Mahmoud Badri

1
Was ist der Überlagerungswert?
Androidevil

2
@androider ist Ihre benutzerdefinierte Ansicht. Entweder aus XML aufgeblasen oder im Code erstellt.
Bilthon

8

So hat es bei mir funktioniert (von den obigen Antworten wurden sowohl der Standardtitel als auch meine benutzerdefinierte Ansicht angezeigt).

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.

Was mir aufgefallen ist, dass beide setCustomView(view)und setCustomView(view,params)die Ansichtsbreite = übereinstimmen / füllen übergeordnet. setDisplayShowCustomEnabled (boolescher showCustom)


6

Die Antworten von Tomik und Peterdk funktionieren, wenn Ihre benutzerdefinierte Ansicht die gesamte Aktionsleiste einnehmen und sogar den nativen Titel ausblenden soll .

Wenn Sie jedoch möchten, dass Ihre benutzerdefinierte Ansicht neben dem Titel angezeigt wird (und den gesamten verbleibenden Platz ausfüllt, nachdem der Titel angezeigt wurde), verweise ich Sie hier auf die hervorragende Antwort des Benutzers Android-Developer:

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

Sein Code unten funktionierte perfekt für mich.


3

Sie können beispielsweise eine Layoutdatei definieren, die ein EditText-Element enthält.

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

du kannst tun

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


    }

sparte meine n Stunden .. Danke
CrazyMind

1

Es gibt ein Beispiel in der Launcher-App von Android (aus der ich hier eine Bibliothek erstellt habe) in der Klasse, die sich mit dem Auswählen von Hintergrundbildern befasst ("WallpaperPickerActivity").

Das Beispiel zeigt, dass Sie ein benutzerdefiniertes Thema festlegen müssen, damit dies funktioniert. Leider funktionierte dies bei mir nur mit dem normalen Framework und nicht mit dem der Support-Bibliothek.

Hier sind die Themen:

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>

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

BEARBEITEN: Es gibt einen besseren Weg, der auch in der Support-Bibliothek funktioniert. Fügen Sie einfach diese Codezeile anstelle der oben beschriebenen hinzu:

getSupportActionBar().setDisplayShowCustomEnabled(true);
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.