web-dev-qa-db-ja.com

ナビゲーションバーで戻るボタンを下向き矢印に変更します

AppCompatDialogFragmentを使用してBottomSheetDialogを表示しています。 Navigation Barの戻るボタンをクリックすると、BottomSheetDialogが閉じます。

Navigation Barのアイコンを戻るボタンから「下矢印」アイコンに変更したい。これは、キーボードが表示されているときにデフォルトで実行され、ボトムシートに複製したいと思います。

明確にするために、ここに私が持っているものがあります:

Current

そして、これが私が必要とするものです:

This is what I want

戻るボタンは「下向き」であることに注意してください。

ナビゲーションバーはシステムUIコンポーネントであり、キーボードが表示されているときに表示されるナビゲーションバーのように表示を変更する方法がわかりません。

26
Vlad

Android O)では、アイコンを変更するという概念が導入されていますが、それでもサードパーティのアプリを使用しています。 カスタムナビゲーションバーWRITE_SECURE_SETTINGSを使用してアイコン。Android O)で、バーの表示、つまり明るいテーマまたは暗いテーマを変更できます。

ソリューション2は、より多くの助けになる可能性があります。ナビゲーションバーにpopup windowを作成して、希望のレイアウト(3つのボタンを戻す、最近のアプリ、ホームボタン)を設定できます。このようにして、それに応じて戻るボタンのアイコンを変更できます。ポップアップウィンドウの高さがナビゲーションバーと同じであることを確認してください。そうすれば、ホームアプリや最近のアプリ用に独自の機能を作成できます。functionの後ろでBottomSheetDialogを閉じて、そのポップアップを削除できます。窓。

以下は、ホームキーと最近のアプリのコードです。戻るボタンについては、それに応じて、独自のアイコンで達成したいことを実行してください。

ホームボタン用。

Intent startMain = new Intent(Intent.ACTION_MAIN);
startMain.addCategory(Intent.CATEGORY_HOME);
startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(startMain);

最近のアプリの場合。

Class serviceManagerClass = Class.forName("Android.os.ServiceManager");
Method getService = serviceManagerClass.getMethod("getService", String.class);
IBinder retbinder = (IBinder) getService.invoke(serviceManagerClass, "statusbar");
Class statusBarClass = Class.forName(retbinder.getInterfaceDescriptor());
Object statusBarObject = statusBarClass.getClasses()[0].getMethod("asInterface", IBinder.class).invoke(null, new Object[] { retbinder });
Method clearAll = statusBarClass.getMethod("toggleRecentApps");
clearAll.setAccessible(true);
clearAll.invoke(statusBarObject);

戻るボタンの場合//アイコンとBottomSheetDialogを閉じる機能を使用します。

ナビゲーションバーの高さを計算するため

public static int getSoftButtonsBarSizePort(Activity activity) {
    // getRealMetrics is only available with API 17 and +
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
        DisplayMetrics metrics = new DisplayMetrics();
        activity.getWindowManager().getDefaultDisplay().getMetrics(metrics);
        int usableHeight = metrics.heightPixels;
        activity.getWindowManager().getDefaultDisplay().getRealMetrics(metrics);
        int realHeight = metrics.heightPixels;
        if (realHeight > usableHeight)
            return realHeight - usableHeight;
        else
            return 0;
    }
    return 0;
}

adbコマンドで実行することもできますが、navigationBarを台無しにする可能性があり、元のnavigationBarを取り戻すことができないことを確認してください。

お役に立てば幸いです。

9
Sahil

すでに回答済みのとおり、Android Oで導入されます。

以前のバージョンでは、フラグをSYSTEM_UI_FLAG_IMMERSIVESYSTEM_UI_FLAG_LAYOUT_FULLSCREENSYSTEM_UI_FLAG_HIDE_NAVIGATIONなどとして使用するAndroid 3.x、または4.4+でのみ可能です。限られた、多くの努力を払うと、あまり友好的ではなく、グリッチさえない結果が得られます。

それが不可能であるという理由は、セキュリティの問題であるためです。アプリは、ユーザーがアプリを終了できないようにする可能性があります。

これらのリンクを見てください:

4
crgarridos

この記事 は、Android Oreoでどのように実行できるかを非常によく説明しています。

0
Cilenco