23

पर एक्शनबार ऊंचाई बदलें मैं हाल ही में एक एंड्रॉइड ऐप विकसित कर रहा हूं, जिसमें मुझे टैब बार के लिए एक कस्टम लेआउट और आयाम होना चाहिए। जिस तरह से मैंने इसे अभी तक किया है वह जेक व्हार्टन की एक्शनबैरशॉक लाइब्रेरी का उपयोग प्री-हनीकॉम्ब एंड्रॉइड संस्करणों का समर्थन करने के लिए है, और उस ऐप को स्टाइल लागू करके जिसमें मैं क्रियाबारी शैली शैली को संपादित करता हूं।एंड्रॉइड जेलीबीन

अब, मैं गैलेक्सी एस 3 (जेलीबीन के साथ) पर ऐप का परीक्षण कर रहा हूं, और टैब बार ऊंचाई actionBarSize मान के अनुसार अब और नहीं बदली है।

तो मैं JellyBean के कोड के माध्यम से तलाश शुरू कर दी है, और मैं ActionBarPolicy कक्षा में इस विधि पाया:

public int getTabContainerHeight() { 
      TypedArray a = mContext.obtainStyledAttributes(null, R.styleable.ActionBar, 
       com.android.internal.R.attr.actionBarStyle, 0); 
      int height = a.getLayoutDimension(R.styleable.ActionBar_height, 0); 
      Resources r = mContext.getResources(); 
      if (!hasEmbeddedTabs()) { 
       // Stacked tabs; limit the height 
       height = Math.min(height, 
         r.getDimensionPixelSize(R.dimen.action_bar_stacked_max_height)); 
      } 
      a.recycle(); 
      return height; 
    } 

मैं क्या इस विधि में इकट्ठा से, ऐसा लगता है कि JellyBean TabBar की ऊंचाई सीमित करता है, जब ऐप पोर्ट्रेट मोड में होता है, तो टैब बार ऊंचाई को "action_bar_stacked_max_height" आयाम मान (जो 48 डीपी है, 4.1 की /values/dimen.xml फ़ाइल में) सेट करके, भले ही मैंने actionBarSize में एक्शन बार ऊंचाई निर्धारित की हो।

मैंने इस आयाम मान को ओवरराइड करने का प्रयास किया है, इसे अपने स्वयं के dimen.xml फ़ाइल में अपने मूल्य पर सेट करके, लेकिन मुझे कोई भाग्य नहीं था। यह काम नहीं किया।

मेरा प्रश्न:

तुम लोग एक तरह से है, जिसमें मैं "action_bar_stacked_max_height" Dimen मूल्य ओवरराइड कर सकते हैं के बारे में पता है?

अग्रिम धन्यवाद!

+0

मेरे पास भी एक ही समस्या है। क्या इसके लिए कोई समाधान मिला है? – user936414

उत्तर

1

यह है कि यह उद्देश्य पर किया गया था मुझे लगता है और मुझे नहीं पता क्यों। वहाँ bools.xml

<bool name="action_bar_embed_tabs">true</bool> 
<bool name="action_bar_embed_tabs_pre_jb">false</bool> 

में कुछ चर हैं एम्बेड टैब की ऊंचाई, ActionBarPolicy.java में 48dip तक ही सीमित है के रूप में आप पहले से ही उल्लेख किया है। यही कारण है कि इस तरह के व्यवहार केवल एंड्रॉइड जेलीबीन या उच्चतर में देखा जा सकता है। मुझे कुछ जावा प्रतिबिंब बनाने के बजाय बेहतर समाधान नहीं मिल रहा है। तो यहाँ अपने onCreate में कोड

private void hackJBPolicy() { 
    View container = findScrollingTabContainer(); 
    if (container == null) return; 

    try { 
     int height = getResources().getDimensionPixelSize(R.dimen.action_bar_height); 
     Method method = container.getClass() 
       .getDeclaredMethod("setContentHeight", Integer.TYPE); 
     method.invoke(container, height); 
    } catch (NoSuchMethodException e) { 
     Log.e(LOG_TAG, e.getLocalizedMessage(), e); 
    } catch (IllegalArgumentException e) { 
     Log.e(LOG_TAG, e.getLocalizedMessage(), e); 
    } catch (IllegalAccessException e) { 
     Log.e(LOG_TAG, e.getLocalizedMessage(), e); 
    } catch (InvocationTargetException e) { 
     Log.e(LOG_TAG, e.getLocalizedMessage(), e); 
    } 
} 

private View findScrollingTabContainer() { 
    View decor = getWindow().getDecorView(); 
    int containerId = getResources().getIdentifier("action_bar_container", "id", "android"); 

    // check if appcompat library is used 
    if (containerId == 0) { 
     containerId = R.id.action_bar_container; 
    } 

    FrameLayout container = (FrameLayout) decor.findViewById(containerId); 

    for (int i = 0; i < container.getChildCount(); i++) { 
     View scrolling = container.getChildAt(container.getChildCount() - 1); 
     String simpleName = scrolling.getClass().getSimpleName(); 
     if (simpleName.equals("ScrollingTabContainerView")) return scrolling; 
    } 

    return null; 
} 

विधि का प्रयोग करें hackJBPolicy() है। ध्यान दें कि मैंने एपकॉम्बेट लाइब्रेरी से एक्शनबार का उपयोग किया था। इस वर्कअराउंड के उपयोग के साथ नमूना परियोजना में link है।

आखिरकार, मुझे लगता है कि भविष्य में यह आसान होगा कि टैब के मोड में एक्शनबार का उपयोग करने के बजाय स्क्रीन के शीर्ष पर गठबंधन कस्टम दृश्य बनाना आसान होगा यदि आपका यूई डिज़ाइन गाइडलाइन से थोड़ा दूर है।

+0

के लिए नहीं, क्या आप कृपया बता सकते हैं कि मानक क्रिया बार का उपयोग करके इसे कैसे कार्यान्वित किया जाए, समर्थन से नहीं पुस्तकालय? मुझे R.id.action_bar_container नामक संसाधन नहीं मिल रहा है। – user2302510

+0

मुझे पता है कि यह बहुत देर से टिप्पणी है, लेकिन मैं st_ के उत्तर को स्वीकार करने जा रहा हूं, भले ही यह प्रतिबिंब का उपयोग करता है (जो सैद्धांतिक रूप से ऐप को धीमा कर देता है)। लेकिन वह "जेबी नीति" के पीछे अपना रास्ता हैक करने के लिए पर्याप्त जानकारी प्रदान करता है। अंत में, मैंने अपनी खुद की कस्टम टैब बार विकसित की, जैसा कि st_ ने कहा था। – edy

26

थीम के तहत android:actionBarSize और actionBarSize डाल आप उपयोग कर रहे हैं तो तरह का प्रयास करें:

<style name="Theme.white_style" parent="@android:style/Theme.Holo.Light.DarkActionBar"> 
     <item name="android:actionBarSize">55dp</item> 
     <item name="actionBarSize">55dp</item> 
</style> 
+6

यह जेलीबीन पर काम नहीं करता है। – Tomik

+1

यह जेलीबीन पर काम करता है। मैंने इसे अपने नेक्सस 4 – Anton

+4

पर पुष्टि की है, ठीक है, यह मुख्य एक्शन बार की ऊंचाई को बदलता है लेकिन यह टैब बार की ऊंचाई को प्रभावित नहीं करता है (निश्चित रूप से एंड्रॉइड 4.2.2 पर नहीं)। – Tomik

9

निम्नलिखित की तरह android:height उपयोग करके देखें:

<style name="AppActionBar"> 
    <item name="android:height">50dp</item> 
</style> 

<style name="MainActivityStyle" parent="@android:style/Theme.Holo"> 
    <item name="android:actionBarStyle">@style/AppActionBar</item> 
</style> 
+1

पर जेलीबीन के सबसे पुराने संस्करण पर काम किया था, स्प्लिट एक्शन बार के लिए काम करता है लेकिन दूसरी पंक्ति/स्टैक्ड बार (टैब) – jfcartier

संबंधित मुद्दे