1

これは短い質問です:、実行時に、アプリ缶私の場合は実行時にツールバーのスタイルを設定することはできますか?

<android.support.v7.widget.Toolbar 
    android:id="@+id/..." 
    android:layout_width="match_parent" 
    android:layout_height="?attr/actionBarSize" 
    android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" 
    app:popupTheme="@style/ThemeOverlay.AppCompat.Light" 
    app:title="@string/..."/> 

私はあなたが指定したテーマで、XMLを経由して、ツールバーを作成することができることを知って、例えば(link)白や暗い色のコンテンツをいくつか持っている。

(サポートライブラリの)ツールバーのテーマを、実行時に特定のテーマに設定することはできますか?

内部のアイテムを適切なセレクタとアイテムティントカラーに設定することは可能ですが、プレゼンテーションを表示するにはまだ効果があります(バックグラウンドの色を白に変更する暗い、効果を見えないようにする)?

+0

はい、実行時にツールバーの色を変更できます。ツールバーツールバー=(ツールバー)(getActivity())。findViewById(R.id.toolbar); toolbar.setBackgroundColor(Color.parseColor( "desired color")); –

+0

@RakshitNawaniこれはすでに行っていますが、タイトル、アイテム、オーバーフローアイテム、セレクタはどうですか?すべてがテーマです。私は背景とタイトルテキストの色を変更しましたが、項目がよく見えません。私はViewStubを使用する必要があると思うし、必要に応じてどのツールバーを膨張させるかを決定しますが、もっと良い方法があればそれについて知りたいと思います。 –

+0

ツールバーのテキストの色、メニューオプション、ツールバーのボタンを別々のフラグメントで表示するために私が行ったことをすぐに回答します。 –

答えて

0


setPopupTheme();

呼ばToolbarクラスのメソッドポップアップメニューを膨張させるときに使用するテーマを指定しますがあります。デフォルトでは、ツールバーと同じテーマを使用します。

単にあなたがToolbarを拡張し、それが動的に現在のすべてのActivity/Fragmentsでのbackground/popup themeを変えることができるので、あなたはそれにイベントを投稿することができ、カスタムclassを作成することができ、ツールバーの背景/ポップアップテーマを変更しますスタックがあります。

たとえば、私はあなたがEventBusを使用する方法でアイデアを持っていると仮定していますが、以下のクラスを考えてみましょう。

public class ThemeableToolbar extends Toolbar { 


    private boolean isSemiTransparent; 

    public ThemeableToolbar(Context context) { 
     super(context); 
     init(); 
    } 

    public ThemeableToolbar(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     init(); 
    } 

    public ThemeableToolbar(Context context, AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
     init(); 
    } 

    private void init() { 
     if (isInEditMode()) return; 
     int primary = PrefHelper.getInt(PrefConstant.PRIMARY_COLOR); 
     if (primary == 0) { 
      primary = ActivityCompat.getColor(getContext(), R.color.primary); 
     } 
     if (isSemiTransparent()) { 
      AnimUtil.animateColorChange(this, ColorUtils.setAlphaComponent(primary, 40), null); 
     } else { 
      AnimUtil.animateColorChange(this, primary, null); 
     } 
    } 

    @Override protected void onAttachedToWindow() { 
     super.onAttachedToWindow(); 
     if (isInEditMode()) return; 
     if (!EventBus.getDefault().isRegistered(this)) { 
      EventBus.getDefault().register(this); 
     } 
    } 

    @Override protected void onDetachedFromWindow() { 
     if (isInEditMode()) return; 
     if (EventBus.getDefault().isRegistered(this)) { 
      EventBus.getDefault().unregister(this); 
     } 
     super.onDetachedFromWindow(); 
    } 

    public void onEvent(ThemeModel themeModel) { 
     init(); 
    } 

    public boolean isSemiTransparent() { 
     return isSemiTransparent; 
    } 

    public void setIsSemiTransparent(boolean isSemiTransparent) { 
     this.isSemiTransparent = isSemiTransparent; 
     setBackgroundColor(ColorUtils.setAlphaComponent(ViewHelper.getPrimaryColor(getContext()), 40)); 
    } 
} 

ThemeModelはそれを通知するEventBusonEventに渡されることを単なるJavaクラスです。

編集は、私はあなたがそれに渡されるイベントを登録し、イベントを受信したときに、その後recreate();どれを呼び出すことによって、あなたの活動を再作成する必要がありますBaseActivityを持っていることをお勧めしたい全体Activity Themeを変更することができるようにしますBaseActivityまで拡張された活動が再現されます。 BaseActivitysuper.onCreate(....)を呼び出す前に、目的のテーマを設定してください。おそらくアンドロイドPreferencesにリファレンスを保存して、設定するテーマを知ることができますか?

+0

アイテムがどのように表示されるのか、セレクタが変更されるとは思わないので、テーマ変更のサポート。私は、XMLに設定したテーマのようなものを意味していました。とにかく、私は他のテーマ設定のように、これにはViewStubなどが必要だと思います。 –

1

私が見つけたように、それは不可能です。

しかし、私はViewStubを使用することができますし、時間が正しいスタイルでツールバーを置くために来るとき、私はそれを行うことができます。

dark_toolbar.xml

<?xml version="1.0" encoding="utf-8"?> 
<android.support.v7.widget.Toolbar 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="?attr/actionBarSize" 
    app:popupTheme="@style/ThemeOverlay.AppCompat.Light" 
    app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"/> 

light_toolbar。XML

<?xml version="1.0" encoding="utf-8"?> 
<android.support.v7.widget.Toolbar 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="?attr/actionBarSize" 
    app:popupTheme="@style/ThemeOverlay.AppCompat.Light" 
    app:theme="@style/ThemeOverlay.AppCompat.ActionBar"/> 

レイアウト:

  <ViewStub 
       android:id="@+id/..." 
       android:layout_width="match_parent" 
       android:layout_height="?attr/actionBarSize"/> 

コード:

ViewStub viewStub = ... 
    viewStub.setLayoutResource(...); 
    final Toolbar toolbar = (Toolbar) viewStub.inflate(); 

私はそれがすでに示されています後、ツールバーの "テーマを変更" する必要がある場合は、私ができます2つのツールバー(それぞれ異なるテーマ)のviewSwitcherを使用し、1つの関数呼び出しごとにもう1つのツールバーで行います。テーマを切り替える必要があるときは、ビュー内のビューを切り替えることができます.Switcher

テーマを切り替えると同じではありませんが、まだまだ素晴らしい回避策です。

+0

しかし、これはどう変わるのですか?テーマ属性ではなく、ツールバーのレイアウトを切り替えています。 – k0sh

+0

私は知っています。私が書いたように、これは不可能なので、少なくとも私は正しい初期化状態にしなければなりません。もう1つの選択肢は、2つのツールバー(各テーマの1つ)のviewSwitcherを持ち、1つの関数で呼び出す関数ごとに、別のメニューバーを呼び出すことです(メニュー項目を追加するなど)。テーマを切り替えるときは、ツールバーを切り替えることができます。 –

+0

しかし、これはテーマのダイナミックな変化ではありません。アプリのデザインにテーマが2つしかない場合は、LOCがたくさん発生する可能性のある素晴らしい回避策ですが、それは問題ありません。しかし、あなたが言ったように、それは意図したとおりに動作する回避策です。 – k0sh

関連する問題