Android 错误:主题。半透明&;标记\u活动\u重新排序\u至\u前端
我有一个半透明主题的活动:Android 错误:主题。半透明&;标记\u活动\u重新排序\u至\u前端,android,android-intent,android-activity,stack,transparency,Android,Android Intent,Android Activity,Stack,Transparency,我有一个半透明主题的活动: android:theme="@android:style/Theme.Translucent.NoTitleBar" 此外,仅此主题就可以重现问题: <style name="MyTheme" parent="@android:style/Theme"> <item name="android:windowIsTranslucent">true</item> <item name="android:wind
android:theme="@android:style/Theme.Translucent.NoTitleBar"
此外,仅此主题就可以重现问题:
<style name="MyTheme" parent="@android:style/Theme">
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:colorBackground">@null</item>
</style>
真的
@android:彩色/透明
@空的
此活动在启动时加载并保存在内存中(当我启动此活动时,我将标志\u activity\u REORDER\u作为额外标记添加到\u FRONT
标志)
问题:当我启动此活动(从菜单)时,该活动没有显示,什么也没有发生。
但是:如果我删除了半透明主题:一切正常,活动将从头开始
是,调用了onNewIntent()
如果我按回去,半透明的活动就是下面的那个!但它必须是顶级的
例如
A(半透明活性)B C
堆栈:A
A星触觉(B)
堆栈:A,B
B.触觉(C)
堆栈:A、B、C
c startActivity(A)//带标志的活动重新排序到前面
堆栈应为:B、C、A
但是A从未被带到前面,尽管它的onNewIntent()被调用
有什么想法吗
旁注
有趣的未回答问题:
不希望使用
singleTask
或singleInstance
的android:launchMode
。这些更改了backback并将活动移动到它们自己的堆栈中。因此我们不再有A,B,C了
singleTask和singleInstance-不适用于大多数应用程序
应用程序,因为它们产生的交互模型
对用户来说是不熟悉的,这与大多数其他
应用程序
想要启动模式的可视化表示的任何人都可以尝试此应用程序:在清单文件中活动的
标记中,启动模式
应该是单任务
从文件:
singleTask—如果在启动活动时已经有任务
以此活动开始运行,然后不启动新的
实例将当前任务置于最前面。现存的
实例将收到一个调用Activity.onNewIntent()
的新实例
正在启动的意图,以及
Intent.FLAG\u ACTIVITY\u将\u带到\u前面
FLAG set。这是一个超集
单顶模式,其中如果已存在
在堆栈顶部启动的活动将收到
此处所述的意图(无需将标志\u活动\u带到\u前方
标志集)
更新
作为更好的解决方法,您可以尝试在onNewIntent()
或onResume
中使整个窗口无效
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
getWindow().getDecorView().invalidate();
}
作为解决办法而不是答案 我已经这样做了:
public class OverlayActivity extends Activity {
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
// Restart self when attempting to be brought to front
Intent restartIntent = new Intent(this, OverlayActivity.class);
startActivity(restartIntent);
finish();
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_overlay);
}
}
如果有人能给我一个答案,他们将赢得布鲁西奖金 我刚刚删除了该标志,它对我来说一切正常,没有任何问题。第一个活动保持透明并在调用时处于顶部。试试看 这里是我整个示例的代码 第一幕
public class FirstAct extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Button btn = new Button(this);
btn.setText("First Here Go To Second");
btn.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
Intent intent = new Intent(FirstAct.this,SecondAct.class);
startActivity(intent);
}
});
setContentView(btn);
}
}
public class SecondAct extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Button btn = new Button(this);
btn.setText("Second Here Go To Third");
btn.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
Intent intent = new Intent(SecondAct.this,ThirdAct.class);
startActivity(intent);
}
});
setContentView(btn);
}
}
public class ThirdAct extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Button btn = new Button(this);
btn.setText("Third Here Go To First");
btn.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
Intent intent = new Intent(ThirdAct.this,FirstAct.class);
//intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
startActivity(intent);
}
});
setContentView(btn);
}
}
SecondAct
public class FirstAct extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Button btn = new Button(this);
btn.setText("First Here Go To Second");
btn.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
Intent intent = new Intent(FirstAct.this,SecondAct.class);
startActivity(intent);
}
});
setContentView(btn);
}
}
public class SecondAct extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Button btn = new Button(this);
btn.setText("Second Here Go To Third");
btn.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
Intent intent = new Intent(SecondAct.this,ThirdAct.class);
startActivity(intent);
}
});
setContentView(btn);
}
}
public class ThirdAct extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Button btn = new Button(this);
btn.setText("Third Here Go To First");
btn.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
Intent intent = new Intent(ThirdAct.this,FirstAct.class);
//intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
startActivity(intent);
}
});
setContentView(btn);
}
}
ThirdAct
public class FirstAct extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Button btn = new Button(this);
btn.setText("First Here Go To Second");
btn.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
Intent intent = new Intent(FirstAct.this,SecondAct.class);
startActivity(intent);
}
});
setContentView(btn);
}
}
public class SecondAct extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Button btn = new Button(this);
btn.setText("Second Here Go To Third");
btn.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
Intent intent = new Intent(SecondAct.this,ThirdAct.class);
startActivity(intent);
}
});
setContentView(btn);
}
}
public class ThirdAct extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Button btn = new Button(this);
btn.setText("Third Here Go To First");
btn.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
Intent intent = new Intent(ThirdAct.this,FirstAct.class);
//intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
startActivity(intent);
}
});
setContentView(btn);
}
}
使用LaunchMode SingleInsance编辑活动
*显示*
如果我们不从AndroidManifest.xml的活动块中设置主题,并在第一个半透明活动的onCreate方法中的setContentView之前设置主题,那么问题就解决了,代码如下:
public class TranslucentActivityDemoActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
这是我的变通方法。我相信问题的起因是要求将后台的半透明活动带到前台。既然我们无法做到这一点,那么让我们开始创建半透明活动的新副本,而不是从头开始完全重新创建一个副本,让我们通过利用片段来减少工作量 因此,如果您的半透明活动看起来像这样(从MKJParekh的答案中复制): 我们可以将其转换为如下内容:
public class FirstAct extends FragmentActivity {
private static SavedState mSavedState;
private FirstFrag mFrag;
public static class FirstFrag extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
final Context context = inflater.getContext();
Button btn = new Button(context);
btn.setText("First Here Go To Second");
btn.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
Intent intent = new Intent(context, SecondAct.class);
startActivity(intent);
}
});
return btn;
}
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mFrag = new FirstFrag();
if (mSavedState != null) mFrag.setInitialSavedState(mSavedState);
getSupportFragmentManager()
.beginTransaction()
.add(android.R.id.content, mFrag)
.commit();
}
@Override
protected void onPause() {
super.onPause();
mSavedState = getSupportFragmentManager().saveFragmentInstanceState(mFrag);
finish();
}
}
使用此代码,我们不需要在以后启动FirstAct
时使用FLAG\u ACTIVITY\u REORDER\u to\u FRONT
标志,因为它将在后台使用以前副本中的SavedState
作为新副本的初始状态
请注意,在上面的示例代码中,我只是销毁了
FirstAct
(保存片段实例状态后调用finish()
)的onPause()
旧副本。一个更为严肃的实现可能会设置一个标志(在onResume()
中检查)当在堆栈中重新访问某个特定副本时是否需要finish()。我在AndroidManifest.xml中将uses权限标记移到应用程序标记之前。这为我解决了问题。是的,重复了你的场景android 2.3,检查你是否得到了的意图。在onNewIntent()中,FLAG\u ACTIVITY\u将\u带到了前面FLAG
onNewIntent()。。当窗口背景设置为透明时,眼睛将看不到它。。如果能看到快照就很清楚了。大约一年半前,有人在安卓开发者群上发布了一条消息。仍然没有响应其他模式-singleTask和singleInstance-不适用于大多数应用程序,因为它们会导致用户可能不熟悉的交互模型,并且与大多数其他应用程序非常不同。
Single Instance会将其推到最前面,但是,当您接着进行下一个活动时,它将处于自己的任务中,即它自己的后台堆栈中。这不是上述问题想要的行为,也不是预期的行为。需要注意的另一点是,您尝试重新排序的活动是taskroot。。