カスタムタイトルバーコンポーネントを取得setContentViewを設定するには

6051 ワード

最近、仕事で奇抜な問題に遭遇しました.Activityにはタイトルバー&Fragmentしか必要ありません.問題をより詳細に説明するためには、ここでは専門的な知識を導入する必要があります.

1.Activityでタイトルバーを定義する

  • タイトルバースタイル
  • を定義する.
        <style name="style_titlebar_stand" parent="android:Theme.Light">
            <item name="android:windowTitleSize">45dp</item>
            <item name="android:windowTitleBackgroundStyle">@style/WindowTitleBackground</item>
        </style>
        <style name="WindowTitleBackground">
            <item name="android:background">@color/green</item>
        </style>
        <color name="green">#00ff00</color>
  • AndroidManifestで声明
  •   <activity  android:name=".MainActivity" android:theme="@style/style_titlebar_stand">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
  • Activityに
  • を追加する
       @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
            setContentView(R.layout.activity_main);
            getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.titlebar);
        }

    これでカスタムタイトルバー付きActivityが完成!

    2.奇抜な質問


    titlebar.xmlレイアウトは次のとおりです.
    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:id="@+id/fl_titlebar" android:layout_height="match_parent"></FrameLayout>

    タイトルバー&Framgentが必要ならactivityは必要ありませんmainレイアウトか!?こんな風に書けると思います.
      @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
    //        setContentView(R.layout.activity_main);
            getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.titlebar);
            FrameLayout titlebarLayout=(FrameLayout)findViewById(R.id.fl_titlebar);
            getFragmentManager().beginTransaction()
                    .replace(android.R.id.content, new TestFragment()).commit();
    
    
        }

    titlebarLayoutでブレークポイントを打つと、titlebarLayoutはnullです!!

    3.奇抜な解決方法


    定義activity_main.xmlレイアウトファイル、内容は以下の通りです.
    <?xml version="1.0" encoding="utf-8"?>
    
    <merge>
    
    
    </merge>

    そして実行してOK!

    結論


    カスタムタイトルバーを使用する場合、setContentViewがない場合、カスタムtitlebarのコンポーネントはonCreateで取得できません.