Bagaimana cara menampilkan tampilan kustom di ActionBar?

92

Saya ingin menampilkan pencarian kustom di actionbar (saya menggunakan ActionBarSherlock untuk itu).

Saya tahu:

masukkan deskripsi gambar di sini

Tapi saya ingin membuat tata letak khusus (bidang edittext) untuk memenuhi seluruh lebar yang tersedia.

Saya telah menerapkan tata letak khusus seperti yang disarankan di sini .

Ada tata letak khusus saya 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>

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

Bagaimana saya bisa membuat tata letak khusus untuk memenuhi semua lebar yang tersedia actionBar?

Tolonglah.

Pedang
sumber
Apakah Anda dapat menyetel judul dengan set tampilan kustom?
Roy Lee

Jawaban:

95

Ada trik untuk ini. Semua harus Anda lakukan adalah dengan menggunakan RelativeLayoutbukan LinearLayoutsebagai wadah utama. Penting untuk android:layout_gravity="fill_horizontal"mengaturnya. Itu harus dilakukan.

Tomik
sumber
3
@Tomik Bisakah Anda melihat skenario saya? stackoverflow.com/questions/16516306/… Saya memiliki judul yang hilang setelah tampilan kustom disetel.
Roy Lee
36

Saya berjuang dengan ini sendiri, dan mencoba jawaban Tomik. Namun, ini tidak membuat tata letak menjadi lebar penuh yang tersedia di awal, hanya saat Anda menambahkan sesuatu ke tampilan.

Anda harus mengatur LayoutParams.FILL_PARENTsaat menambahkan tampilan:

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

Dengan cara ini sepenuhnya mengisi ruang yang tersedia. (Anda mungkin perlu menggunakan solusi Tomik juga).

Peterdk
sumber
2
+1, sebenarnya, itu hanya bekerja untuk saya setelah menambahkan LayoutParams, thnx
Mahmoud Badri
1
apa nilai overlaynya?
androidevil
2
@androider adalah tampilan kustom Anda. Baik dipompa dari xml atau dibuat dalam kode.
Bilthon
8

Beginilah cara kerjanya untuk saya (dari jawaban di atas itu menunjukkan judul default dan tampilan kustom saya juga).

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.

Yang saya perhatikan adalah keduanya setCustomView(view)dan setCustomView(view,params)view width = match / fill parent. setDisplayShowCustomEnabled (boolean showCustom)

Bharatesh
sumber
6

Jawaban dari Tomik dan Peterdk berfungsi jika Anda ingin tampilan kustom memenuhi seluruh bilah tindakan, bahkan menyembunyikan judul asli.

Tetapi jika Anda ingin tampilan kustom Anda hidup berdampingan dengan judul (dan mengisi semua ruang yang tersisa setelah judul ditampilkan), izinkan saya merujuk Anda ke jawaban yang sangat baik dari pengguna Android-Developer di sini:

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

Kode di bawahnya bekerja dengan sempurna untuk saya.

Mike Repass
sumber
3

Misalnya, Anda dapat menentukan file tata letak yang berisi elemen 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> 

Anda dapat melakukan

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


    }
BoldHD
sumber
menghemat n jam saya .. Terima kasih
CrazyMind
1

Ada contoh di aplikasi peluncur Android (saya telah membuat pustaka darinya, di sini), di dalam kelas yang menangani pengambilan wallpaper ("WallpaperPickerActivity").

Contoh tersebut memperlihatkan bahwa Anda perlu menyetel tema yang disesuaikan agar ini berfungsi. Sayangnya, ini berfungsi untuk saya hanya menggunakan kerangka kerja normal, dan bukan salah satu pustaka dukungan.

Inilah temanya:

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>

nilai-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: ada cara yang lebih baik untuk melakukannya, yang juga berfungsi di pustaka dukungan. Cukup tambahkan baris kode ini daripada yang saya tulis di atas:

getSupportActionBar().setDisplayShowCustomEnabled(true);
pengembang android
sumber