Android 如何执行模态DialogFragment(代码在关闭之前不会执行)
我有一个活动,在应用程序第一次运行时弹出指令(在对话框片段中) 我想在用户不关闭对话框的情况下停止代码的执行 有可能这样做吗 编辑: 我尝试使用CountDownLatch,但它冻结了我的UI,并且对话框没有显示 活动:Android 如何执行模态DialogFragment(代码在关闭之前不会执行),android,android-dialogfragment,Android,Android Dialogfragment,我有一个活动,在应用程序第一次运行时弹出指令(在对话框片段中) 我想在用户不关闭对话框的情况下停止代码的执行 有可能这样做吗 编辑: 我尝试使用CountDownLatch,但它冻结了我的UI,并且对话框没有显示 活动: private CountDownLatch startSignal; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);
private CountDownLatch startSignal;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// open tutorial if need
startSignal = new CountDownLatch(1);
TutorialDialog tutoDial = new TutorialDialog();
tutoDial.show(getSupportFragmentManager(), "tuto");
try {
toast("aguardando");
startSignal.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
对话框(我只列出了所需的方法):
公共类教程Dialog扩展了DialogFragment{
私有最终字符串标记=getClass().getSimpleName();
MAP活动;亲子活动;
共享参考偏好
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
parentActivity = ((MapActivity) activity);
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
// setStyle(DialogFragment.STYLE_NORMAL, 0);
AlertDialog.Builder principal = new AlertDialog.Builder(getActivity());
principal.setInverseBackgroundForced(true);
// principal.setTitle(R.string.report);
View view = getActivity().getLayoutInflater().inflate(
R.layout.tutorial, null);
TextView ok = (TextView)view.findViewById(R.id.ok);
ok.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
parentActivity.resumeCode();
dismiss();
}
});
AlertDialog ad = principal.create();
return ad;
}
}
在活动中,方法resumeCode():
公共代码(){
开始信号倒计时();
吐司(“下一步是什么”);
}
编辑2:我实现了好几次。我的最后一个实现应该是一个,但它仍然不起作用。我将试着解释它是如何进行的
mainActivity(主线程)启动dialogFragment:
TutorialDialog tutoDial = new TutorialDialog();
tutoDial.setCancelable(true);
tutoDial.show(getSupportFragmentManager(), "tuto");
然后,在另一个线程中,我在onPreExecute()中运行wait():
公共类GetPlaces扩展异步任务>{
private ProgressDialog dialog;
// I put it public so that I can reach it from the DialogFragment
public static CountDownLatch startSignal = new CountDownLatch(1);
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
试一试{
开始信号。等待();
}捕捉(中断异常e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
dialog=新建进度对话框(上下文);
对话框。可设置可取消(false);
setMessage(context.getString(R.string.loading));
dialog.isIndeterminate();
setProgressStyle(R.style.dialogInput);
dialog.show();
}
这样,它不应该在startSignal变量达到0之前运行
然后,在我的FragmentDialog中,当对话框关闭时,我运行:
noTuto.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// DISMISS DIALOG
startSignal.countDown();
dismiss();
}
});
所以从理论上讲,这应该是可行的,但在丑陋的现实中,我那支离破碎的对话冻结了
我确信的是:
1-mainActivity中没有startSignal.await();应该再冻结UI了
2-startSignal变量在另一个线程中定义:
public class GetPlaces extends AsyncTask<Void, Void, ArrayList<Place>>
公共类GetPlaces扩展异步任务
所以,如果有什么东西冻结了,应该是这个线程,但我不明白为什么我的对话框会冻结。现在,我的对话框不再收到点击…使用
CountDownLatch startSignal=new CountDownLatch(1);
您的代码通常在用户线程中执行。请将您的用户线程代码设置为startSignal.await();
,以便它可以暂停执行
您的
对话框片段将在UI线程中执行。使您的UI线程代码开始信号。倒计时()
,以恢复用户线程代码执行。我的实现阻止了我的UI!我更新了我的帖子。我想我在他呈现视图之前阻止了UI。我尝试了不同的方法,总是一样的…对话框不显示的原因是因为您正在调用startSignal.wait();
在UI线程中。您的UI线程被阻止执行。这就是为什么您的UI被冻结,并且没有机会显示您的对话框。但是即使我将其放在对话框的onResume()方法中(它至少应该显示第一个活动,在onResume中,渲染应该已经完成),始终处于冻结状态。不要在UI线程中调用startSignal.await()。(按UI线程继续执行)也许您应该在不使用CountDownLatch的情况下重新表述代码。请给出一个明确的示例,说明您试图实现的目标以及阻止您实现目标的原因。因此,如果我理解得很好,我应该在一个新线程中运行DialogFragment,阻止主线程,并且由于我的对话框位于一个新线程中,我将能够单击一些东西来释放我的UI,我说的对吗???