Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/212.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 如何执行模态DialogFragment(代码在关闭之前不会执行)_Android_Android Dialogfragment - Fatal编程技术网

Android 如何执行模态DialogFragment(代码在关闭之前不会执行)

Android 如何执行模态DialogFragment(代码在关闭之前不会执行),android,android-dialogfragment,Android,Android Dialogfragment,我有一个活动,在应用程序第一次运行时弹出指令(在对话框片段中) 我想在用户不关闭对话框的情况下停止代码的执行 有可能这样做吗 编辑: 我尝试使用CountDownLatch,但它冻结了我的UI,并且对话框没有显示 活动: private CountDownLatch startSignal; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);

我有一个活动,在应用程序第一次运行时弹出指令(在对话框片段中)

我想在用户不关闭对话框的情况下停止代码的执行

有可能这样做吗

编辑: 我尝试使用CountDownLatch,但它冻结了我的UI,并且对话框没有显示

活动:

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,我说的对吗???