我该怎么做模态DialogFragment(代码不执行直到我关闭它)

时间:2013-12-11 00:46:15

标签: android android-dialogfragment

我有一个活动在应用程序第一次运行时弹出说明(在DialogFragment中)。

我希望在用户不关闭对话框时停止执行代码。

这样做是否可行???

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

活动:

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(我只是把所需的方法):

公共类TutorialDialog扩展DialogFragment {     private final String TAG = getClass()。getSimpleName();     MapActivity parentActivity;     SharedPreferences首选项;

@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;

}

}

在Activity中,方法resumeCode():

public void resumeCode(){         startSignal.countDown();         吐司(“什么是下一个”);     }

编辑2:我实施了好几次。我的最后一个实现应该是一个,但它仍然不起作用。我将尝试解释它是如何发生的。

mainActivity(主线程)启动dialogFragment:

TutorialDialog tutoDial = new TutorialDialog();
        tutoDial.setCancelable(true);
        tutoDial.show(getSupportFragmentManager(), "tuto");

然后,在另一个线程中,我在onPreExecute()中运行await():

public class GetPlaces扩展了AsyncTask> {

private ProgressDialog dialog;
    // I put it public so that I can reach it from the DialogFragment
public static CountDownLatch startSignal = new CountDownLatch(1);  

@覆盖     protected void onPreExecute(){         super.onPreExecute();         尝试{             startSignal.await();         } catch(InterruptedException e){             // TODO自动生成的catch块             e.printStackTrace();         }         dialog = new ProgressDialog(context);         dialog.setCancelable(假);         dialog.setMessage(context.getString(R.string.loading));         dialog.isIndeterminate();         dialog.setProgressStyle(R.style.dialogInput);         dialog.show();     }

这样,它不应该在startSignal变量达到0之前运行

然后,在我的FragmentDialog中,当对话关闭时,我运行:

    noTuto.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // DISMISS DIALOG
            startSignal.countDown();
            dismiss();
        }
    });

所以从理论上讲,它应该有效,但在丑陋的现实中,我的FragmentDialog会冻结......

我确信: 1 - 没有startSignal.await();在mainActivity中应该再冻结UI 2 - startSignal变量在另一个线程中定义:

public class GetPlaces extends AsyncTask<Void, Void, ArrayList<Place>>

所以,如果有任何冻结,它应该是这个帖子,但我不明白为什么我的对话框是冻结的。现在,我的对话框不再收到点击次数了......

1 个答案:

答案 0 :(得分:1)

使用CountDownLatch startSignal = new CountDownLatch(1);

您的代码通常会在用户线程中执行。使您的用户线程代码startSignal.await();,以便它可以暂停执行。

您的DialogFragment将在UI线程中执行。制作UI线程代码startSignal.countDown(),以恢复用户线程代码执行。