จะแสดงมุมมองแบบกำหนดเองใน ActionBar ได้อย่างไร?


93

ฉันต้องการแสดงการค้นหาที่กำหนดเองในแถบการดำเนินการ (ฉันใช้ ActionBarSherlock สำหรับสิ่งนั้น)

ฉันเข้าใจ:

ป้อนคำอธิบายภาพที่นี่

แต่ฉันต้องการสร้างเค้าโครงที่กำหนดเอง (ช่องแก้ไขข้อความ) เพื่อใช้ความกว้างทั้งหมดที่มีอยู่

ผมเคยนำมาใช้รูปแบบที่กำหนดเองตามที่แนะนำที่นี่

มีเค้าโครงที่กำหนดเองของฉัน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>

และใน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);

ฉันจะสร้างเลย์เอาต์แบบกำหนดเองเพื่อใช้ความกว้างทั้งหมดที่มีอยู่ได้actionBarอย่างไร?

ช่วยด้วย.


คุณสามารถตั้งชื่อด้วยชุดมุมมองแบบกำหนดเองได้หรือไม่?
Roy Lee

คำตอบ:


95

มีเคล็ดลับสำหรับเรื่องนี้ สิ่งที่คุณต้องทำคือใช้RelativeLayoutแทนLinearLayoutคอนเทนเนอร์หลัก สิ่งสำคัญคือต้องandroid:layout_gravity="fill_horizontal"ตั้งค่าไว้ ที่ควรทำ


3
@ Tomik คุณช่วยดูสถานการณ์ของฉันได้ไหม? stackoverflow.com/questions/16516306/…ฉันไม่มีชื่อเรื่องหลังจากตั้งค่ามุมมองแบบกำหนดเองแล้ว
Roy Lee

36

ฉันพยายามดิ้นรนด้วยตัวเองและลองใช้คำตอบของโทมิก อย่างไรก็ตามสิ่งนี้ไม่ได้ทำให้เค้าโครงมีความกว้างเต็มเมื่อเริ่มต้นเมื่อคุณเพิ่มบางสิ่งลงในมุมมองเท่านั้น

คุณจะต้องตั้งค่าLayoutParams.FILL_PARENTเมื่อเพิ่มมุมมอง:

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

วิธีนี้จะทำให้เต็มพื้นที่ว่าง (คุณอาจต้องใช้น้ำยาของ Tomik ด้วย)


2
+1 จริงๆแล้วมันใช้ได้เฉพาะกับฉันหลังจากเพิ่ม LayoutParams แล้ว thnx
Mahmoud Badri

1
ค่าซ้อนทับคืออะไร?
androidevil

2
@androider เป็นมุมมองที่คุณกำหนดเอง สูงเกินจริงจาก xml หรือสร้างในโค้ด
Bilthon

9

นี่คือวิธีการทำงานสำหรับฉัน (จากคำตอบด้านบนมันแสดงทั้งชื่อเริ่มต้นและมุมมองที่กำหนดเองของฉันด้วย)

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.

สิ่งที่ฉันสังเกตเห็นคือทั้งคู่setCustomView(view)และsetCustomView(view,params)view width = match / fill parent setDisplayShowCustomEnabled (บูลีน showCustom)


การเปลี่ยน MATCH_PARENT เป็น WRAP_CONTENT เนื่องจากค่าของพารามิเตอร์ที่สองทำให้เคล็ดลับ การใช้ LinearLayout ...
ka3ak

6

คำตอบจาก Tomik และ Peterdk ใช้ได้ผลเมื่อคุณต้องการให้มุมมองแบบกำหนดเองของคุณครอบครองแถบการทำงานทั้งหมดแม้กระทั่งซ่อนชื่อเนทีฟ

แต่ถ้าคุณต้องการให้มุมมองที่กำหนดเองของคุณแสดงเคียงข้างกันกับชื่อเรื่อง (และเติมช่องว่างที่เหลือทั้งหมดหลังจากที่แสดงชื่อเรื่อง) ฉันขอแนะนำคุณเกี่ยวกับคำตอบที่ยอดเยี่ยมจากผู้ใช้ Android-Developer ที่นี่:

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

รหัสของเขาที่ด้านล่างทำงานได้ดีสำหรับฉัน


3

ตัวอย่างเช่นคุณสามารถกำหนดไฟล์เค้าโครงที่มีองค์ประกอบ 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> 

คุณทำได้

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


    }

บันทึก n ชั่วโมงของฉัน .. ขอบคุณ
CrazyMind

1

มีตัวอย่างในแอปตัวเรียกใช้งานของ Android (ซึ่งฉันได้สร้างห้องสมุดจากที่นี่แล้ว) ภายในชั้นเรียนที่จัดการการเลือกวอลเปเปอร์ ("WallpaperPickerActivity")

ตัวอย่างแสดงให้เห็นว่าคุณต้องตั้งค่าธีมที่กำหนดเองเพื่อให้ใช้งานได้ น่าเศร้าที่สิ่งนี้ใช้ได้ผลสำหรับฉันโดยใช้เฟรมเวิร์กปกติเท่านั้นไม่ใช่ไลบรารีสนับสนุน

นี่คือธีม:

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>

ค่า -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>

แก้ไข: มีวิธีที่ดีกว่านี้ซึ่งใช้ได้กับไลบรารีการสนับสนุนด้วย เพียงเพิ่มโค้ดบรรทัดนี้แทนสิ่งที่ฉันเขียนไว้ด้านบน:

getSupportActionBar().setDisplayShowCustomEnabled(true);
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.