当前位置: 首页 > 知识库问答 >
问题:

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

鲁望
2023-03-14

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

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

有可能做到吗???

编辑:我尝试使用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();
    }
}

}

对话框(我只列出了所需的方法):

公共类教程对话框扩展了DialogFragment{private final String TAG=getClass().getSimpleName();MapActivity parentActivity;SharedReferences首选项;

@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():

公共无效resumeCode(){开始ignal.count();祝酒词(下一步是什么);}

编辑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();尝试{startSignal.await();}catch(InterruptedException e){//TODO自动生成的catch块e.printStackTrace();}dialog=新建进度对话框(上下文);对话可设置可取消(假);对话setMessage(context.getString(R.string.loading));对话isIndeterminate();对话setProgressStyle(R.style.dialogInput);对话show();}

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

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

    noTuto.setOnClickListener(new OnClickListener() {

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

所以理论上,它应该可以工作,但是在丑陋的现实中,我的FragmentDialog冻结了...

我确信的是:1-没有启动信号。等待();在应该冻结UI的mainActivity 2中-startSignal变量在另一个线程定义

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

所以,如果有任何东西冻结,它应该是这个线程,但我不明白为什么我的对话是一个冻结。现在,我的对话框不再收到点击。。。

共有1个答案

勾通
2023-03-14

使用CountDownLatch启动信号=新的CountDownLatch(1)

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

你的DialogFra402将在UI线程中执行。使您的UI线程代码start Signal.countDown(),以恢复您的用户线程代码执行。

 类似资料:
  • 问题内容: 我想做这样的事情: 如何捕获对话框中的输入? 问题答案: 需要有两个处理程序,一个和一个。见下文。这将确保,如果在对话框中单击“取消”,则不会触发。但是,如果单击“确定”,将执行并将运行必要的代码。这可以用于释放数据库锁,整洁地关闭打开的会话等。

  • 问题内容: 是否有用于PHP源文件的静态分析工具?二进制本身可以检查语法错误,但是我正在寻找功能更多的东西,例如: 未使用的变量分配 未先初始化就分配给的数组 以及可能的代码样式警告 … 问题答案: 从命令行以lint-mode运行php来验证语法而不执行: 更高级别的静态分析器包括: php-sat - Requires http://strategoxt.org/ PHP_Depend PHP

  • 维基百科和其他一些网站将口译员描述为将代码从某种高级语言翻译成某种低级语言的翻译人员。然而,有很多解释,包括stackoverflow,它说解释器直接执行作为输入的指令,而无需事先转换。那么,解释器是像编译器一样的翻译器,还是像CPU一样的执行器呢?

  • 我正在启动一个带有子进程的程序,并通过for循环遵循该命令。直到我启动的程序关闭,循环才会运行。我不明白这是为什么。有人能解释一下吗? 我的代码: 我在Pi 3(armv7l)上运行Raspbian操作系统。 谢谢你抽出时间。 L

  • 您的Google Maps代码结构如下所示: 回调? JavaScriptpromise? 您能想到的其他方法吗? 同样,这里所建议的信号量是一种可行的方法吗?

  • 问题内容: 我正在尝试结合以下注释: 像下面的代码: @Before方法中的代码在@Sql批注中的脚本“ dml-parametro.sql”之后运行。 这样做对吗? 对于此解决方案,我使用@After而不是@Before,但我想在测试执行之前而不是之后cdelete表。 我不想使用@SqlConfig。我没有在测试级别上使用Transacional范围,因此我需要在每种测试方法中清除表。如果每个