Android लॉलीपॉप, AppCompat ActionBar कस्टम दृश्य पूरी स्क्रीन चौड़ाई नहीं लेता है


97

इसलिए, मैंने अभी लॉलीपॉप के लिए अपना कोडबेस अपडेट किया है, और मैं एक्शन बार के साथ समस्या कर रहा हूं। मैं AppCompat और ActionBarActivity का उपयोग कर रहा हूं, और एक कस्टम दृश्य फुला रहा हूं। ऐसा लगता है कि कस्टम दृश्य अब स्क्रीन की पूरी चौड़ाई नहीं लेता है, बाईं ओर एक पतली पट्टी छोड़ देता है

19 के साथ भवन जिस तरह से यह दिखता था

21 के साथ भवन अब ऐसा लग रहा है

यह वह कोड है जो मैं एक्शन बार सेट करने के लिए उपयोग कर रहा हूं। क्या किसी के भी पास कोई सुझाव है?

final ActionBar actionBar = getSupportActionBar();
if(actionBar != null) {
    actionBar.setDisplayHomeAsUpEnabled(false);
    actionBar.setDisplayShowHomeEnabled(false);
    actionBar.setDisplayShowTitleEnabled(false);
    actionBar.setDisplayShowCustomEnabled(true);
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
    actionBar.setCustomView(R.layout.action_bar_content_search_custom_view);
    actionBar.setBackgroundDrawable(null);
    // actionBar.setStackedBackgroundDrawable(null);
    TextView title = (TextView) actionBar.getCustomView().findViewById(R.id.action_bar_title);
    title.setText(R.string.youtube);
    ImageView back = (ImageView) actionBar.getCustomView().findViewById(R.id.action_bar_back);
    back.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            finish();
        }
    });
}

संपादित करें

कस्टम दृश्य को बाहर निकालना और पृष्ठभूमि को बदलना अब पूरी चौड़ाई लेता है। तो मुद्दा यह है कि, हम कैसे कस्टम व्यू को एक्शनबार की पूरी चौड़ाई में ले जा सकते हैं?


यदि आप अस्थायी रूप से कस्टम दृश्य भागों पर टिप्पणी करते हैं, तो क्या यह बेहतर व्यवहार करता है? यदि नहीं, तो मैं आपके विषय से आने वाली इस दिशा में झुकूंगा।
कॉमन्सवेयर

मैंने कस्टम दृश्य को हटा दिया, और इसे
एक्शनबार के बैकग्राउंड ड्रॉबल के

आप अपनी गतिविधि को पदानुक्रम दृश्य में देख सकते हैं, दोनों कस्टम दृश्य के साथ और उसके बिना, और देखें कि क्या आप यह निर्धारित कर सकते हैं कि कस्टम दृश्य के परिणामस्वरूप लेआउट नियम क्या बदल रहे हैं। यह संभव है कि यह नए में एक बग है appcompat-v7
कॉमन्सवेयर

मुझे लगता है कि ऊपर के लिए आरक्षित जगह है ImageView। इसे शुरुआत के लिए अक्षम करने का प्रयास करें।
निकोला डेस्पोटोस्की

1
नमस्ते, ऐसा लगता है कि यह एक अच्छा समाधान है कि कस्टम दृश्य पूरी चौड़ाई ले। मैं अनुभव कर रहा था कि इसका विस्तार नहीं है, यहाँ तक कि लेआउट वेट के साथ भी। यहाँ देखें: stackoverflow.com/a/20794736/581574
रत्न 12

जवाबों:


111

ऐसा लगता ActionBarहै कि हालिया appcompat-v7अपडेट में नवीनतम परिवर्तनों के कारण ऐसा हुआ है । ऐसा लगता है कि महत्वपूर्ण बदलाव हैं कि आपको कार्रवाई सलाखों को कैसे संभालना चाहिए।

मैंने उसी मुद्दे का सामना किया और ActionBarदस्तावेज़ीकरण पढ़ने के बाद , और विशेष रूप से निम्नलिखित उद्धरण में मुझे एक समाधान मिला।

Android L (API स्तर 21) के साथ शुरुआत करते हुए, एक्शन बार को एप्लिकेशन लेआउट के भीतर किसी भी टूलबार विजेट द्वारा दर्शाया जा सकता है। एप्लिकेशन उस गतिविधि को संकेत दे सकता है जिसे टूलबार को गतिविधि के एक्शन बार के रूप में माना जाना चाहिए। गतिविधियाँ जो इस सुविधा का उपयोग करती हैं, उन्हें आपूर्ति की गई .NoActionBar विषयों में से किसी एक का उपयोग करना चाहिए, WindowActionBar विशेषता को झूठा सेट करें या अन्यथा खिड़की सुविधा का अनुरोध न करें।

जिस तरह से मैं इसे देखता हूं, AppCompatविषयों को बदल दिया गया था और एक तरफ कुछ चीजों को तोड़ने के लिए लग रहा था लेकिन दूसरे पर बहुत अधिक लचीलापन प्रदान करता है। मैं इन चरणों का पालन करने की सलाह देता हूं:

  1. .NoActionBarउपरोक्त गतिविधि में वर्णित अनुसार अपनी गतिविधि में शैली का उपयोग करें
  2. android.support.v7.widget.Toolbarअपने गतिविधि लेआउट में जोड़ें
  3. app:contentInsetStart="0dp"विशेषता सेट करें । आपके प्रश्न में वर्णित मार्जिन के साथ यह मुख्य मुद्दा है
<android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/actionBar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:contentInsetEnd="0dp"
    app:contentInsetStart="0dp" >
</android.support.v7.widget.Toolbar>

यह आमतौर पर अनुशंसा की जाती है कि आप एक अलग लेआउट फ़ाइल में और includeअपनी गतिविधि लेआउट में उपयोग करें ताकि आपको केवल एक ही जगह पर टूलबार को अनुकूलित करना होगा यदि कई गतिविधियों में उपयोग किया जाता है

<include layout="@layout/view_action_bar" />
  1. अपनी गतिविधि में उपयोग करें findViewByIdऔर करने के लिएsetSupportActionBaronCreatesignal to the Activity which Toolbar should be treated as the Activity's action bar
Toolbar actionBar = (Toolbar) findViewById(R.id.actionBar);
setSupportActionBar(actionBar);
  1. एक बार जब आप ऐसा कर लेते हैं, onCreateOptionsMenuतो टूलबार में जोड़े गए सभी कार्यों को जोड़ दिया जाएगा और इसे एक्शन एक्शन बार माना जाएगा।
  2. टूलबार को वांछित रूप से अनुकूलित करें (बच्चे के विचार जोड़ें आदि)

1
मैं नेविगेशन दराज के साथ टूलबार का उपयोग करने की कोशिश कर रहा हूं, लेकिन मुझे त्रुटि हो रही हैError inflating class fragment
अहमद नवाज

सभी प्रासंगिक कोड उत्तर पर साझा किए गए हैं। लगता है कि आपको अपने मामले के लिए एक नया प्रश्न शुरू करना चाहिए क्योंकि यह एक अलग समस्या की तरह लगता है।
मुज़िकांत

धन्यवाद। मैंने टूलबार के साथ एक्शनबार को प्रतिस्थापित करके समस्या को हल किया।
अहमद नवाज़

9
आपको नामस्थान घोषणाओं में स्पष्ट पैकेज नामों का उपयोग नहीं करना चाहिए। का उपयोग करेंxmlns:app="http://schemas.android.com/apk/res-auto"
22

1
इसकी कोई जरूरत नहीं है setCustomView। विजेट्स के साथ एक लेआउट फाइल
बनाएं, जिसे

51

मुज़िकांत द्वारा बताए गए और इस जवाब को पसंद करने के बजाय इतना काम करें

    getSupportActionBar().setDisplayShowHomeEnabled(false);
    getSupportActionBar().setDisplayShowTitleEnabled(false);
    getSupportActionBar().setBackgroundDrawable(new ColorDrawable(Color.WHITE));
    LayoutInflater mInflater = LayoutInflater.from(this);

    View mCustomView = mInflater.inflate(R.layout.action_bar_home, null);
    getSupportActionBar().setCustomView(mCustomView);
    getSupportActionBar().setDisplayShowCustomEnabled(true);
    Toolbar parent =(Toolbar) mCustomView.getParent();//first get parent toolbar of current action bar 
    parent.setContentInsetsAbsolute(0,0);// set padding programmatically to 0dp

आपको अपनी समस्या को हल करने के लिए कोड की अंतिम दो पंक्तियों को जोड़ना होगा।

मुझे उम्मीद है कि यह आपकी और किसी और की मदद कर सकता है।

अद्यतन: इस पर कुछ शोध करने के बाद, मैंने पाया कि यह समाधान कुछ मामलों में काम नहीं करेगा। इसके साथ लेफ्ट साइड गैप (HOME या BACK) हटा दिया जाएगा लेकिन राइट साइड गैप (MENU) जैसा है वैसा ही रहेगा। इन मामलों में नीचे समाधान है।

View v = getSupportActionBar().getCustomView();
LayoutParams lp = v.getLayoutParams();
lp.width = LayoutParams.MATCH_PARENT;
v.setLayoutParams(lp);

इन चार पंक्तियों को उपरोक्त कोड में जोड़ें, ताकि समर्थन कार्रवाई पट्टी से दाईं ओर की खाई भी दूर हो जाए।


धन्यवाद! धन्यवाद! अंतिम 2 लाइनों के लिए क्या देख रहे थे!
डिजिटलमर्स

हम इन लाइनों को कहां जोड़ते हैं? टूलबार भाग के बाद?
ज़ेन

1
@summers हाँ उन्हें टूलबार कोड के तुरंत बाद जोड़ते हैं।
अमृत ​​बिदरी

31

मुझे लगता है कि आप शैलियों में भी ऐसा कर सकते हैं। इसे इस्तेमाल करे। किटकैट पर इसका परीक्षण किया

<style name="AppTheme" parent="Theme.AppCompat">
  <item name="toolbarStyle">@style/AppThemeToolbar</item>
</style>

<style name="AppThemeToolbar" parent="Widget.AppCompat.Toolbar" >
  <item name="contentInsetStart">0dp</item>
</style>

1
यह उत्तर गलत है: Android: contentInsetStart के लिए API स्तर 21 (वर्तमान न्यूनतम 14 है) की आवश्यकता है
mr.boyfox 7

लेकिन, मुहावरा बहुत अच्छा! आपको एपीआई 21 और पुराने संस्करणों के लिए अलग से लेखन शैली की आवश्यकता है।
mr.boyfox 8

यदि आप अभी भी डिफ़ॉल्ट एक्शन बार का उपयोग कर रहे हैं, तो बाएं मार्जिन को हटाने का यह सही उत्तर है।
प्रातः

यह वास्तव में काम करता है! समर्थन लिब के नवीनतम संस्करण के साथ, मुझे लगता है कि आपको विशेषताओं को दो बार घोषित करने की आवश्यकता नहीं है (एंड्रॉइड: वाले आवश्यक नहीं हैं)।
BoD

मैं इस समस्या को खोज रहा हूं और जब मुझे आपका उत्तर मिल गया, तो मैंने देखा कि मैंने पहले ही इसे उखाड़ दिया है! तो दो बार धन्यवाद।
user1732313

8

अन्य उत्तरों में से किसी ने भी मेरे लिए काम नहीं किया, इसलिए मैंने यहां पाए गए वास्तविक AppCompat v7 शैलियों पर एक नज़र डाली ।

यदि आप Base.Widget.AppCompat.ActionBar शैली को देखते हैं, तो यह है:

<item name="contentInsetStart">@dimen/abc_action_bar_content_inset_material</item>
<item name="contentInsetEnd">@dimen/abc_action_bar_content_inset_material</item>

तो जाहिर है हमें सिर्फ अपनी कार्रवाई बार शैली में उन गुणों को ओवरराइड करने की आवश्यकता है:

<style name="ActionBar" parent="@style/Base.Widget.AppCompat.ActionBar">
        <item name="contentInsetStart">0dp</item>
        <item name="contentInsetEnd">0dp</item>
</style>

इसने मेरे लिए बहुत अच्छा काम किया, आशा है कि यह दूसरों की भी मदद करेगा।


हां, चुने हुए उत्तर के रूप में बताया गया है, कुंजी सामग्री है InsetStart और ActionBar / Toolbar की सामग्रीInsetEnd विशेषताएँ। यह आपकी खुद की शैली को परिभाषित करने के लिए वैध है, लेकिन आप उन्हें अपने xml में टूलबार की विशेषताओं पर 0dp पर सेट भी कर सकते हैं
Stevie Kideckel

1

मॉनिटर के खिलाफ मेरे सिर को बहुत पीटने के बाद, इसने मेरे लिए काम किया

 Toolbar toolbar = (Toolbar) actionBar.getCustomView().getParent();
        toolbar.setContentInsetStartWithNavigation(0);
        toolbar.setContentInsetEndWithActions(0);
        toolbar.setContentInsetsAbsolute(0, 0);
        toolbar.setPadding(0, 0, 0, 0);

GetCustomView ()। GetParent () क्या चाल है


0

मुझे आज ही इस समस्या का सामना करना पड़ा, तब मुझे पता चला कि मैं चल रहा था res/values-v21/styles.xml अपने प्रोजेक्ट के अंदर था जो कि एंड्रॉइड स्टूडियो द्वारा स्वचालित रूप से उत्पन्न किया गया था और यही कारण है।

क्यों?

क्योंकि मेरी res/values-v21/styles.xmlसामग्री थी:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="BaseAppTheme" parent="android:Theme.Material.Light">
    </style>
</resources>

और मेरे पास res/values/styles.xmlकुछ इस तरह था:

<style name="BaseAppTheme" parent="android:Theme.Holo.Light">
    <!-- Customize your theme here. -->
    <item name="android:windowContentOverlay">@null</item>
    <item name="android:soundEffectsEnabled">false</item>
</style>

फिर जब मैंने लॉलीपॉप पर अपना ऐप चलाया, तो res/values-v21/styles.xmlइसका इस्तेमाल किया गया था, और इससे ओपी की समस्या ठीक हो गई थी। तो मैं एक साधारण तय करने के लिए आया था बस हटा रहा है:

    <style name="BaseAppTheme" parent="android:Theme.Material.Light">
    </style>

में res/values-v21/styles.xml


0

मुद्दे पर:

 ActionBar actionBar = getSupportActionBar();
                actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
                actionBar.setCustomView(R.layout.actionbar_layout);
                Toolbar toolbar = (Toolbar) actionBar.getCustomView().getParent();
                    toolbar.setContentInsetsAbsolute(0, 0);
                    toolbar.setPadding(0, 0, 0, 0);

सही टूलबार आयात करना सुनिश्चित करें - android.support.v7.widget.Toolbar;


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