Làm thế nào để hiển thị chế độ xem tùy chỉnh trong ActionBar?


92

Tôi muốn hiển thị tìm kiếm tùy chỉnh trong thanh hành động (Tôi đang sử dụng ActionBarSherlock cho điều đó).

Tôi đã hiểu:

nhập mô tả hình ảnh ở đây

Nhưng tôi muốn tạo bố cục tùy chỉnh (trường edittext) để chiếm toàn bộ chiều rộng có sẵn.

Tôi đã triển khai bố cục tùy chỉnh như được đề xuất ở đây .

Có bố cục tùy chỉnh của tôi 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>

Và trong 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);

Làm cách nào để tạo bố cục tùy chỉnh để chiếm tất cả chiều rộng có sẵn của actionBar?

Giúp tôi với.


Bạn có thể đặt tiêu đề với chế độ xem tùy chỉnh không?
Roy Lee

Câu trả lời:


95

Có một mẹo nhỏ cho việc này. Tất cả những gì bạn phải làm là sử dụng RelativeLayoutthay vì LinearLayoutlàm thùng chứa chính. Điều quan trọng là phải android:layout_gravity="fill_horizontal"thiết lập cho nó. Nên làm vậy.


3
@Tomik Bạn có thể vui lòng xem kịch bản của tôi được không? stackoverflow.com/questions/16516306/… Tôi thiếu tiêu đề sau khi đặt chế độ xem tùy chỉnh.
Roy Lee

36

Tôi đã tự mình đấu tranh với điều này và thử câu trả lời của Tomik. Tuy nhiên, điều này đã không làm cho bố cục đạt đến chiều rộng có sẵn đầy đủ khi bắt đầu, chỉ khi bạn thêm thứ gì đó vào dạng xem.

Bạn sẽ cần đặt LayoutParams.FILL_PARENTkhi thêm chế độ xem:

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

Bằng cách này, nó hoàn toàn lấp đầy không gian có sẵn. (Bạn cũng có thể cần sử dụng giải pháp của Tomik).


2
+1, trên thực tế, nó chỉ làm việc cho tôi sau khi thêm LayoutParams, thnx
Mahmoud Badri

1
giá trị lớp phủ là gì?
androidevil

2
@androider là chế độ xem tùy chỉnh của bạn. Được thổi phồng từ xml hoặc được tạo trong mã.
Bilthon

8

Đây là cách nó hoạt động đối với tôi (từ các câu trả lời ở trên, nó đã hiển thị cả tiêu đề mặc định và chế độ xem tùy chỉnh của tôi).

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.

Những gì tôi nhận thấy là cả hai setCustomView(view)setCustomView(view,params)độ rộng chế độ xem = khớp / điền cha. setDisplayShowCustomEnabled (boolean showCustom)


6

Câu trả lời từ Tomik và Peterdk hoạt động khi bạn muốn chế độ xem tùy chỉnh của mình chiếm toàn bộ thanh tác vụ, thậm chí ẩn tiêu đề gốc.

Nhưng nếu bạn muốn chế độ xem tùy chỉnh của mình song song với tiêu đề (và lấp đầy tất cả không gian còn lại sau khi tiêu đề được hiển thị), thì tôi có thể giới thiệu cho bạn câu trả lời xuất sắc từ người dùng Android-Developer tại đây:

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

Mã của anh ấy ở dưới cùng hoạt động hoàn hảo cho tôi.


3

Ví dụ: bạn có thể xác định tệp bố cục chứa phần tử 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> 

bạn có thể làm

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


    }

lưu n giờ tôi .. Cảm ơn
CrazyMind

1

Có một ví dụ trong ứng dụng launcher của Android (tôi đã tạo một thư viện từ nó, tại đây), bên trong lớp xử lý chọn hình nền ("WallpaperPickerActivity").

Ví dụ cho thấy rằng bạn cần đặt một chủ đề tùy chỉnh để nó hoạt động. Đáng buồn thay, điều này chỉ hoạt động đối với tôi khi sử dụng khuôn khổ bình thường, và không phải là một trong những thư viện hỗ trợ.

Đây là các chủ đề:

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>

CHỈNH SỬA: có một cách tốt hơn để làm điều đó, cách này cũng hoạt động trên thư viện hỗ trợ. Chỉ cần thêm dòng mã này thay vì những gì tôi đã viết ở trên:

getSupportActionBar().setDisplayShowCustomEnabled(true);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.