Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/184.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 更改单顶活动的主题_Android_Android Actionbar_Actionbarsherlock - Fatal编程技术网

Android 更改单顶活动的主题

Android 更改单顶活动的主题,android,android-actionbar,actionbarsherlock,Android,Android Actionbar,Actionbarsherlock,因此,我的应用程序中有一个活动当前标记为 android:launchMode="singleTop" …我目前在onCreate和onNewIntent中都有逻辑,以确保屏幕始终显示由最新发布的Intent交付的数据。我希望能够根据这个意图提供的数据,在全息光和全息暗之间进行转换 调用setTheme不起作用(请参见以下两个链接): 第二个链接有一个变通方法,它涉及创建第二个AndroidManifest.xml条目,该条目具有另一个主题,并指向相关活动的空子类。这是可行的,但它打破

因此,我的应用程序中有一个活动当前标记为

android:launchMode="singleTop"
…我目前在onCreate和onNewIntent中都有逻辑,以确保屏幕始终显示由最新发布的Intent交付的数据。我希望能够根据这个意图提供的数据,在全息光和全息暗之间进行转换

调用setTheme不起作用(请参见以下两个链接):

第二个链接有一个变通方法,它涉及创建第二个AndroidManifest.xml条目,该条目具有另一个主题,并指向相关活动的空子类。这是可行的,但它打破了singleTop(因为现在堆栈上可以有两个活动实例)


我没有主意了。除了为这个活动滚动我自己的自定义ActionBar视图之外,有人知道有没有其他方法可以做到这一点吗?

因为您指的是Holo主题,所以我假设您使用的是API 11+

API 11添加了该方法,该方法通过与配置更改(如在横向和纵向方向之间旋转屏幕)相同的拆卸/重新创建过程发送当前活动。您的onCreate方法将在新的活动实例上再次调用,允许您在初始化窗口之前设置活动的主题


Google Books应用程序使用此策略在“夜间模式”的亮/暗主题之间切换。

您需要使用setTheme()方法设置主题,然后重新加载活动


我有一个单任务活动和一个在API上运行的代码我将发布我的解决方案,该解决方案不会在这里添加任何新内容,而是将各种技巧合并在一起

更改活动主题和应用程序的可选主题(取决于您要查找的内容)后:

public void updateTheme( Activity a, int themeID ) {
    a.getApplication().setTheme( themeID );
    a.setTheme( themeID );
}
然后必须重新创建活动(就像在配置更改之后一样)。 对于OS11>有一个API,而对于以前的版本,您必须强制它完成并重新启动活动,正如所指出的那样

public boolean isBeforeHoneycomb() {
    return Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB;
}

public void reload() {
    if( isBeforeHoneycomb() ) {
        Intent intent = getIntent();
        overridePendingTransition(0, 0);
        intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
        finish();

        overridePendingTransition(0, 0);
        startActivity(intent);
    }else{
        recreate();
    }
}
public boolean isBeforeHoneycomb(){
返回Build.VERSION.SDK_INT
很抱歉,actionbarsherlock标签本应表明我需要它来处理的不仅仅是最新和最好的。是的,但您仍然可以使用完成和启动新活动并使用此活动的方法来支持较旧的操作系统版本(假设更好,just cause是API的一部分)在支持它的设备上。对于尝试此方法的任何其他人,我必须将方法的第3行更改为intent.setFlags。所讨论的意图设置了intent.FLAG\u ACTIVITY\u REORDER\u TO\u FRONT标志,这导致重新启动失败。
public boolean isBeforeHoneycomb() {
    return Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB;
}

public void reload() {
    if( isBeforeHoneycomb() ) {
        Intent intent = getIntent();
        overridePendingTransition(0, 0);
        intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
        finish();

        overridePendingTransition(0, 0);
        startActivity(intent);
    }else{
        recreate();
    }
}