以编程方式关闭操作栏中的android:windowActionBarOverlay样式

Che*_*eng 8 android actionbarsherlock

目前,我正在使用ActionBarSherlock.我要启动SecondActivityMainActivity.

MainActivity正在使用windowActionBarOverlay打开样式的操作栏.SecondActivity正在使用windowActionBarOverlay关闭了样式的操作栏.因此,这是我的XML的样子.

<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"  
    android:debuggable="false" >
    <activity
        android:name=".MainActivity"
        android:label="@string/app_name" 
        android:theme="@style/ThemeWithActionBarOverlay"
        android:screenOrientation="nosensor" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity 
        android:name=".SecondActivity" 
        android:theme="@style/ThemeWithoutOverlay">
    </activity>
</application>
Run Code Online (Sandbox Code Playgroud)
<resources>
    <style name="ThemeWithActionBarOverlay" parent="@style/Theme.Sherlock">
        <item name="android:windowActionBarOverlay">true</item>
        <item name="abIcon">@drawable/ic_home</item>
        <item name="abTitleTextStyle">@style/ActionBarCompatTitle</item>
    </style>

    <style name="ThemeWithoutOverlay" parent="@style/Theme.Sherlock">
        <item name="abIcon">@drawable/ic_home</item>
        <item name="abTitleTextStyle">@style/ActionBarCompatTitle</item>
    </style>
</resources>
Run Code Online (Sandbox Code Playgroud)

但是,通过这样做SecondActivity,我意识到我在动作栏的左上角永远不会有一个向上/向后按钮.虽然有图标显示,但不能按下.只有使用返回相同的主题(ThemeWithActionBarOverlay)MainActivity,才会显示向上/向后按钮.但是,如果我允许SecondActivity使用相同的主题MainActivity,我发现无法关闭windowActionBarOverlay行为.

// SecondActivity
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.history_list_activity);

    ActionBar actionBar = this.getActionBar();

    actionBar.setDisplayHomeAsUpEnabled(true);
    // How to turn android:windowActionBarOverlay attribute to false during runtime?
    // actionBar.??? 
}
Run Code Online (Sandbox Code Playgroud)

我的问题是

  1. 为什么子活动必须使用与父级相同主题的操作栏,以便显示正确的上/后按钮?有什么方法可以使用不同的主题,但是在儿童活动中会出现上/后按钮吗?
  2. 是否可以windowActionBarOverlay在运行时转换样式?

tin*_*oft 4

要回答您的第一个问题,您不需要让父活动和子活动使用相同的主题来使“向上”按钮正常工作。事实上,我正在开发一个类似的父/子活动应用程序,并且它使用两个不同的主题(父级没有覆盖的主题和子级的全屏主题(带覆盖))工作得很好。

一定还有其他原因导致它不起作用......

  • 确保您已将MainActivity定义为第二个 Activity 的父级。您可以通过代码或首选方式在AndroidManifest.xml中执行此操作:

    <activity
        android:name=".SecondActivity" 
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value=".MainActivity" />
    </activity>
    
    Run Code Online (Sandbox Code Playgroud)
  • 确保在您的子活动中,您已激活“向上”导航:

     final ActionBar actionBar = getSupportActionBar();
     actionBar.setDisplayHomeAsUpEnabled(true);
    
    Run Code Online (Sandbox Code Playgroud)

对于第二个问题,请尝试将'ThemeWithoutOverlay'主题中的'windowActionBarOverlay'覆盖为false

<style name="ThemeWithoutOverlay" parent="@style/Theme.Sherlock">
    <item name="android:windowActionBarOverlay">false</item>
    <item name="windowActionBarOverlay">false</item><
    <item name="abIcon">@drawable/ic_home</item>
    <item name="abTitleTextStyle">@style/ActionBarCompatTitle</item>
</style>
Run Code Online (Sandbox Code Playgroud)