2013-05-06 6 views
16

मुझे पता है कि change the homeAsUpIndicator in the styles xml file कैसे करें। सवाल यह है कि इसे प्रोग्रामेटिक रूप से कैसे बदला जाए।प्रोग्राम के रूप में संसाधन के रूप में घर कैसे बदलें?

कारण मैं इसे करना चाहता हूं क्योंकि कुछ विचारों में मैं साइड नेविगेशन (स्लाइडिंग मेनू) का समर्थन करता हूं - ऊपर/पीछे शीर्षक बटन दबाकर, साइड मेनू दिखाता है।

अन्य विचारों में मैं प्राकृतिक ऊपर/पीछे कपास का समर्थन करता हूं।

इस प्रकार मैं दो अलग-अलग तर्कों को इंगित करने के लिए अलग-अलग संकेतक आइकन करना चाहता हूं - साइड नेविगेशन बनाम ऊपर/पीछे।

कृपया, ऐसा करने की प्रेरणा पर बहस न करें। यही दिया गया राज्य है। धन्यवाद।

+0

हालांकि संसाधन (upId) पाया जाता है, और नए imageView, परिभाषित Galaxy S3 डिवाइस पर यह नहीं काम करता है हैक काम किया। हालांकि, जब मैंने नेक्सस 4 पर परीक्षण किया, तो ठीक काम करता है। – seufagner

उत्तर

20
int upId = Resources.getSystem().getIdentifier("up", "id", "android"); 
if (upId > 0) { 
    ImageView up = (ImageView) findViewById(upId); 
    up.setImageResource(R.drawable.ic_drawer_indicator); 
} 
+0

काम करता है, लेकिन एक हैक की तरह लगता है। क्या यह दस्तावेज है? क्या भविष्य में 'अप' नाम बदल सकता है? –

+0

मैं कहूंगा कि यह एक हैक है। हालांकि, यह देखने के लिए एकमात्र तरीका है। इसे भविष्य में बदला जा सकता है लेकिन मैं इसके होने का एक कारण कल्पना नहीं कर सकता। –

+0

जैसा कि seufagner ने कहा, मैंने मान्य किया कि यह ** ** ** समसंग गैलेक्सी एस 3 पर काम नहीं करता है। –

15

@matthias द्वारा समाधान सभी उपकरणों पर काम नहीं करता है, एक बेहतर समाधान को बदलने के लिए homeAsUpIndicator शैली में सेट यह @null और लोगो संसाधन प्रोग्राम के रूप में बदलने के लिए है।

नीचे style.xml

<style name="Theme.HomeScreen" parent="AppBaseTheme"> 
    <item name="displayOptions">showHome|useLogo</item> 
    <item name="homeAsUpIndicator">@null</item> 
    <item name="android:homeAsUpIndicator">@null</item> 
</style> 

कोड में से मेरे कोड आप setLogo() पद्धति का उपयोग करके लोगो बदल सकता है।

getSupportActionBar().setLogo(R.drawable.abc_ic_ab_back_holo_light); //for ActionBarCompat 
getActionBar().setLogo(R.drawable.abc_ic_ab_back_holo_light); //for default actionbar for post 3.0 devices 

भी ध्यान रखें कि Android API 18 तरीकों है, प्रोग्राम के homeAsUpIndicator संपादित करने के लिए refer documentation

1

मैं इसके लिए समाधान लिखता हूं। यह सुंदर नहीं है, लेकिन काम करता है:

public static ImageView getHomeAndUpIndicator(View decorView) { 
    ImageView res = null; 

    int upId = Resources.getSystem().getIdentifier("up", "id", "android"); 
    if (upId > 0) { 
     res = (ImageView) decorView.findViewById(upId); 
    } else { 
     if (android.os.Build.VERSION.SDK_INT <= 10) { 
      ViewGroup acbOverlay = (ViewGroup)((ViewGroup)decorView).getChildAt(0); 
      ViewGroup abcFrame = (ViewGroup)acbOverlay.getChildAt(0); 
      ViewGroup actionBar = (ViewGroup)abcFrame.getChildAt(0); 
      ViewGroup abLL = (ViewGroup)actionBar.getChildAt(0); 
      ViewGroup abLL2 = (ViewGroup)abLL.getChildAt(1); 
      res = (ImageView)abLL2.getChildAt(0); 
     } else if (android.os.Build.VERSION.SDK_INT > 10 && android.os.Build.VERSION.SDK_INT < 16) { 
      ViewGroup acbOverlay = (ViewGroup)((ViewGroup)decorView).getChildAt(0); 
      ViewGroup abcFrame = (ViewGroup)acbOverlay.getChildAt(0); 
      ViewGroup actionBar = (ViewGroup)abcFrame.getChildAt(0); 
      ViewGroup abLL = (ViewGroup)actionBar.getChildAt(1); 
      res = (ImageView)abLL.getChildAt(0); 
     } else { 
      ViewGroup acbOverlay = (ViewGroup)((ViewGroup)decorView).getChildAt(0); 
      ViewGroup abcFrame = (ViewGroup)acbOverlay.getChildAt(1); 
      ViewGroup actionBar = (ViewGroup)abcFrame.getChildAt(0); 
      ViewGroup abLL = (ViewGroup)actionBar.getChildAt(0); 
      ViewGroup abF = (ViewGroup)abLL.getChildAt(0); 
      res = (ImageView)abF.getChildAt(0); 
     } 
    } 
    return res; 
} 

एक परम डाल के रूप में:। GetWindow() getDecorView() कुछ उपकरणों पर

टेस्ट (नेक्सस 7 (4.4.2), सैमसंग गैलेक्सी s + (2.3। 6), yaiu g3 (4.2.2)) और एंड्रॉइड 2.3.3 और 4.1.1

5

हालांकि this answer अपेक्षित व्यवहार प्राप्त कर सकता है, जैसा कि आप नीचे दी गई टिप्पणियों में पढ़ सकते हैं: "यह हैक नहीं है कुछ उपकरणों पर काम "। मुझे Adneal's answer के अनुसार एक और तरीका मिला जो मुझे सुराग और विशेष रूप से करने का सही तरीका देता है।

  • लोअर एपीआई: उपयोग आईडी R.id.up संबंधित ImageView पुनः प्राप्त करने के।

  • एपीआई> = 14: मिल होम ImageView (android.R.id.home) और पहला बच्चा जो UpIndicator (android.R.id.up) है पुनः प्राप्त के रिश्तेदार Parent

फिर, इस स्निपेट कोड को गतिशील UpIndicator परिवर्तन:

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) { 
    // get the parent view of home (app icon) imageview 
    ViewGroup home = (ViewGroup) findViewById(android.R.id.home).getParent(); 
    // get the first child (up imageview) 
    ((ImageView) home.getChildAt(0)) 
     // change the icon according to your needs 
     .setImageDrawable(getResources().getDrawable(R.drawable.custom_icon_up)); 
} else { 
    // get the up imageview directly with R.id.up 
    ((ImageView) findViewById(R.id.up)) 
     .setImageDrawable(getResources().getDrawable(R.drawable.custom_icon_up)); 
} 

मैं कई उपकरणों पर परीक्षण नहीं किया (यही कारण है कि मुझे यकीन है कि यह ऊपर कोड सभी उपकरणों के लिए काम करता है नहीं कर रहा हूँ है), लेकिन इस लगता है कि the update part here में उल्लिखित एपीआई में बहुत अच्छा काम करता है।

नोट: यदि आप उच्च और निम्न एपीआई के बीच अंतर कर नहीं है, तो आप एक NullPointerException क्योंकि R.id.up उच्च API में उपलब्ध है, जबकि android.R.id.up निम्नतर API में उपलब्ध नहीं है नहीं है मिल जाएगा।

4

इस के लिए मुझे

getSupportActionBar().setHomeAsUpIndicator(R.drawable.my_home_as_up) 
0

यहाँ कूट चल रहा है

final Drawable upArrow = getResources().getDrawable(R.drawable.ic_arrow_back_black_24dp); 
     upArrow.setColorFilter(Color.parseColor("#000000"), PorterDuff.Mode.SRC_ATOP); 
     getSupportActionBar().setHomeAsUpIndicator(upArrow); 
संबंधित मुद्दे