17

スタイルxmlファイルのhomeAsUpIndicatorを変更する方法を知っています。問題は、プログラムで変更する方法です。

一部のビューではサイドナビゲーション(スライドメニュー)をサポートしているため、それを実行したい理由- 上/戻るタイトルボタンを押すと、サイドメニューが表示されます。

他の見解では、自然なアップ/バックボタンを支持します。

したがって、サイド ナビゲーションとアップ/バックの 2 つの異なるロジックを示すために、さまざまなインジケーター アイコンを使用したいと考えています。

これを行う動機について議論しないでください。それが与えられた状態です。ありがとう。

4

6 に答える 6

10

これは私のために働いた

getSupportActionBar().setHomeAsUpIndicator(R.drawable.my_home_as_up)
于 2016-02-28T23:25:09.573 に答える
5

この回答は期待される動作を達成する可能性がありますが、その下のコメントで読むことができるように、「このハックは一部のデバイスでは機能しません」。アドニールの答えによると、別の方法を見つけました。これは、手がかりと、特に正しい方法を提供してくれます。

  • 下位 API: id R.id.upを使用して、関連する を取得しますImageView

  • API >= 14: ParentHome ImageView( android.R.id.homeUpIndicator ) の相対を取得し、 ( android.R.id.up ) である最初の子を取得します。

次に、このスニペット コードは以下を動的に変更します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));
}  

複数のデバイスでテストしていません (そのため、上記のコードがすべてのデバイスで機能するかどうかはわかりません)

注: 上位 API と下位 API を区別しない場合、R.id.upは上位 API では使用できandroid.R.id.upないが、 は下位 API では使用できないため、NullPointerException が発生します。

于 2014-05-07T16:17:01.513 に答える
2

これに対する解決策を書きます。美しくはありませんが、機能します:

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

いくつかのデバイス (nexus 7 (4.4.2)、samsung galaxy s+ (2.3.6)、yaiu g3 (4.2.2))、および android 2.3.3 と 4.1.1 を搭載したエミュレーターでテストします。

于 2013-12-11T11:14:17.020 に答える