2013-05-06 5 views
16

Ich weiß, wie man change the homeAsUpIndicator in the styles xml file. Die Frage ist, wie man es programmgesteuert ändert.Wie programmgesteuert zu Hause als Ressource wechseln?

Der Grund, warum ich es tun will, weil ich in einigen Ansichten unterstütze Seitennavigation (Schiebe-Menü) - Drücken der Titel-Taste oben/zurück, zeigt das Seitenmenü. In anderen Ansichten unterstütze ich die natürliche up/zurück botton.

Also würde ich gerne verschiedene Anzeigesymbole, um die zwei verschiedenen Logiken anzuzeigen - Seitennavigation vs. nach oben/zurück.

Bitte, lassen Sie uns nicht über die Motivation streiten, dies zu tun. Das ist der gegebene Zustand. Vielen Dank.

+0

Obwohl Ressource (UPID) gefunden wird, und neue Imageview definiert, bei Galaxy S3 Gerät nicht funktioniert hacken. Wie auch immer, wenn ich bei Nexus 4 getestet habe, funktioniert es gut. – seufagner

Antwort

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

Funktioniert, fühlt sich aber an wie ein Hack. Ist das dokumentiert? Kann sich der Name in Zukunft ändern? –

+0

Ich würde sagen, es ist ein Hack. Es ist jedoch der einzige Weg, um zur Ansicht zu gelangen. Es könnte in der Zukunft geändert werden, aber ich kann mir keinen Grund vorstellen, dass dies geschieht. –

+0

Wie seufagner sagte, habe ich bestätigt, dass dies ** nicht ** auf der Samasung Galaxy S3 funktioniert. –

15

Die Lösung von @matthias funktioniert nicht auf allen Geräten, eine bessere Lösung zu ändern die homeAsUpIndicator es @null in der Art eingestellt ist und das Logo Ressource programmatisch ändern.

Unten ist mein Code aus 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> 

In Code, den Sie auf das Logo setLogo() Methode ändern.

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 

Beachten Sie auch, dass die Android API 18 Methoden, um den homeAsUpIndicator programmatisch refer documentation, zu bearbeiten hat.

1

Ich schreibe Lösung dafür. Es ist nicht schön, aber funktioniert:

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

Als param Put. getWindow() getDecorView()

-Test auf wenigen Geräten (Nexus 7 (4.4.2), Samsung Galaxy S + (2.3. 6), yaiu g3 (4.2.2)) und Emulatoren mit android 2.3.3 und 4.1.1

5

Obwohl this answer könnten das erwartete Verhalten erreichen, wie Sie unten in den Kommentaren lesen können: "Dieser Hack funktioniert nicht Arbeiten an einigen Geräten ". Ich habe einen anderen Weg nach Adneal's answer gefunden, der mir den Schlüssel und vor allem den richtigen Weg gibt.

  • Lower API: Verwendung id R.id.up die zugehörige ImageView abzurufen.

  • API> = 14: Holen Sie die relative Parent of Home ImageView (android.R.id.home) und das erste Kind abrufen, das ist die UpIndicator (android.R.id.up).

Dann wird dieses Snippet-Code ändert sich dynamisch der 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)); 
} 

Ich habe nicht auf mehreren Geräten getestet (das ist, warum ich bin nicht sicher, dies oben Code für alle Geräte funktioniert), aber diese scheint in APIs, die in the update part here erwähnt werden, großartig zu funktionieren.

Hinweis: Wenn Sie nicht den Unterschied zwischen höheren und niedrigeren APIs machen, werden Sie eine Nullpointer bekommen, weil R.id.up in höheren API nicht verfügbar ist, während android.R.id.up in niedriger API nicht verfügbar ist.

4

Dieser arbeitete für mich

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

Hier Code funktioniert

final Drawable upArrow = getResources().getDrawable(R.drawable.ic_arrow_back_black_24dp); 
     upArrow.setColorFilter(Color.parseColor("#000000"), PorterDuff.Mode.SRC_ATOP); 
     getSupportActionBar().setHomeAsUpIndicator(upArrow); 
Verwandte Themen