ActionBar में कस्टम दृश्य कैसे प्रदर्शित करें?


92

मैं एक्शनबार में कस्टम खोज प्रदर्शित करना चाहता हूं (मैं इसके लिए 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?

कृपया मदद करें।


क्या आप कस्टम दृश्य सेट के साथ शीर्षक सेट करने में सक्षम हैं?
रॉय ली

जवाबों:


95

इसके लिए एक ट्रिक है। आपको केवल मुख्य कंटेनर के RelativeLayoutबजाय उपयोग करना है LinearLayout। इसके android:layout_gravity="fill_horizontal"लिए सेट होना जरूरी है । इससे हो जाना चाहिए।


3
@Tomik क्या आप मेरे परिदृश्य पर एक नज़र डाल सकते हैं? stackoverflow.com/questions/16516306/… कस्टम दृश्य सेट होने के बाद मेरे पास शीर्षक गायब है।
रॉय ली

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

इस तरह यह उपलब्ध स्थान को पूरी तरह से भर देता है। (आपको टोमिक के घोल का भी उपयोग करना पड़ सकता है)।


2
+1, वास्तव में, इसने लेआउटपार्म्स को जोड़ने के बाद केवल मेरे लिए काम किया, thnx
महमूद बद्री

1
ओवरले मूल्य क्या है?
androidevil

2
@androider आपका कस्टम दृश्य है। या तो xml से फुलाया गया या कोड में बनाया गया।
बिल्थोन

8

यह मेरे लिए कैसे काम करता है (उपरोक्त उत्तरों से यह डिफ़ॉल्ट शीर्षक और मेरे कस्टम दृश्य दोनों को दिखा रहा था)।

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)दृश्य चौड़ाई = मैच / अभिभावक भरें। सेट डिसेप्लेस्कॉव कस्टमइन्फिल्ड (बूलियन शो कस्टम)


6

टोमिक और पीटरडक के उत्तर तब काम करते हैं जब आप चाहते हैं कि आपका कस्टम दृश्य पूरे एक्शन बार पर कब्जा कर ले , यहां तक ​​कि मूल शीर्षक को छिपाकर।

लेकिन अगर आप चाहते हैं कि आपका कस्टम दृश्य शीर्षक के साथ साथ-साथ रहें (और शीर्षक प्रदर्शित होने के बाद शेष सभी स्थान भरें), तो मैं आपको यहां उपयोगकर्ता के एंड्रॉइड-डेवलपर के उत्कृष्ट उत्तर का उल्लेख कर सकता हूं:

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

एंड्रॉइड के लॉन्चर ऐप में एक उदाहरण है (जो मैंने यहां एक पुस्तकालय बनाया है, यहां), उस वर्ग के अंदर जो वॉलपेपर-पिकिंग ("वॉलपेपरपिक्कएक्टिविटी") को संभालता है।

उदाहरण दिखाता है कि आपको काम करने के लिए एक अनुकूलित थीम सेट करने की आवश्यकता है। अफसोस की बात है, यह मेरे लिए केवल सामान्य ढांचे का उपयोग करके काम किया, न कि समर्थन पुस्तकालय में से एक।

यहाँ विषय हैं:

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>

EDIT: इसे करने का एक बेहतर तरीका है, जो सपोर्ट लाइब्रेरी पर भी काम करता है। जैसा मैंने ऊपर लिखा है, उसके बजाय कोड की इस पंक्ति को जोड़ें:

getSupportActionBar().setDisplayShowCustomEnabled(true);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.