我有一个具有“登录”按钮的活动,“登录”按钮具有asynctask,并且在任务开始之前应显示正在加载的AlertDialog,然后关闭对话框并在完成时退出到另一个活动。
我需要它来处理方向更改,但是如果方向发生在线程运行时,则片段会被破坏,并且在onPostExecute()
中调用DialogFragment.dismiss会给我一个空指针异常。我该怎么办?
在执行前
FragmentManager fm = getFragmentManager();
TestDiag alertFrag = new TestDiag();
alertFrag.show(fm, "Alert_Dialog");
在PostExecute()上
FragmentManager fm = getFragmentManager();
TestDiag alertFrag2= (TestDiag) fm.findFragmentByTag("Alert_Dialog");
alertFrag2.dismiss();
编辑:我已经尝试过在保留实例true上设置,它可以工作,但是也不起作用。
最佳答案
我只是锁定方向,直到我的AsyncTask完成,onPreExecute()->锁定和onPostExecute()->释放。
public class Device {
public static void lockOrientation(Activity activity) {
Display display = ((WindowManager) activity.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
int rotation = display.getRotation();
int tempOrientation = activity.getResources().getConfiguration().orientation;
int orientation = 0;
switch(tempOrientation)
{
case Configuration.ORIENTATION_LANDSCAPE:
if(rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_90)
orientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
else
orientation = ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE;
break;
case Configuration.ORIENTATION_PORTRAIT:
if(rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_270)
orientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
else
orientation = ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT;
}
activity.setRequestedOrientation(orientation);
}
public static void releaseOrientation(Activity activity) {
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
}
}
如果您确实要在任务运行时允许更改方向:Using AsyncTask with progress dialogs and device rotation.