【发布时间】:2014-07-11 13:42:34
【问题描述】:
我的 Android 代码有一个非常奇怪的行为。
实际问题在代码之后。
我想做的是有一个应用程序,它只能在手机上的纵向模式和平板电脑上的纵向和横向模式下工作。为此,我在不同的文件夹中创建了三个 bool.xml 文件。这个在文件夹值中:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<bool name="portrait_only">true</bool>
</resources>
在我放的 values-xlarge 和 values-sw600dp 中
<?xml version="1.0" encoding="utf-8"?>
<resources>
<bool name="portrait_only">false</bool>
</resources>
项目中唯一的活动加载,在启动时通过附加一个 SplashScreenFragment 来启动一个初始屏幕。这里是活动
public class MainActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getResources().getBoolean(R.bool.portrait_only))
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
if (getSupportActionBar() != null)
getSupportActionBar().hide();
setContentView(R.layout.activity_main);
if (savedInstanceState == null) {
getSupportFragmentManager().beginTransaction()
.add(R.id.container, new SplashScreenFragment()).commit();
}
}
}
片段本身只是加载一个布局并启动一个更改片段的 TimerTask。在这里
public class SplashScreenFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_splash_screen, container, false);
Timer splashScreenTimer = new Timer();
splashScreenTimer.schedule(new SplashScreenTimerTask(getActivity()), 2000);
return rootView;
}
private class SplashScreenTimerTask extends TimerTask {
private FragmentActivity activity;
public SplashScreenTimerTask(FragmentActivity activity) {
this.activity = activity;
}
@Override
public void run() {
FragmentTransaction transaction = activity.getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.container, new FragmentMain());
transaction.commit();
}
}
}
现在,如果我在手机上以纵向模式启动应用程序,一切都可以完美运行,而如果我在手机以横向模式启动应用程序,那么第一个片段会完美加载,但是当行
transaction.commit();
执行后,应用程序崩溃并在 logcat 中出现以下错误
E/AndroidRuntime(17433): FATAL EXCEPTION: Timer-0
E/AndroidRuntime(17433): Process: it.assottica.android, PID: 17433
E/AndroidRuntime(17433): java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
E/AndroidRuntime(17433): at android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1354)
E/AndroidRuntime(17433): at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1372)
E/AndroidRuntime(17433): at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:595)
E/AndroidRuntime(17433): at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:574)
E/AndroidRuntime(17433): at it.assottica.android.fragments.SplashScreenFragment$SplashScreenTimerTask.run(SplashScreenFragment.java:40)
E/AndroidRuntime(17433): at java.util.Timer$TimerImpl.run(Timer.java:284)
有人知道为什么会发生这种情况以及如何解决吗?但是,最重要的是,如果我在手机上以横向或纵向模式启动应用程序,为什么一切正常?
【问题讨论】:
-
@the-guy-with-the-hat,感谢编辑,虽然我不明白为什么我不能提前感谢某人。作为一名编辑,我有一个问题要问你:既然我已经解决了自己的问题,我可以将我的答案标记为正确还是违反某些 stackoverflow 的政策?
-
是的。您也可以accept your own answer,但您必须等待 48 小时才能这样做。 stackoverflow.com/help/self-answer
-
查看this 对编辑问题时是否应该删除“绒毛”的回答?,特别是在它说“与问题/帖子无关的任何内容都是噪音和应该被删除。这包括......签名,'谢谢'......“是的,你可以而且应该接受你自己的答案。
标签: java android android-fragments android-appcompat