Android从对话框返回值

Posted

技术标签:

【中文标题】Android从对话框返回值【英文标题】:Android return value from dialog 【发布时间】:2018-03-27 18:12:56 【问题描述】:

我正在构建一个安卓应用程序。在这个 sn-p 中,我尝试调用verifyKey 方法,该方法会弹出一个对话框输入密钥,以便确认它是否正确并允许发送消息。

不幸的是,程序没有返回并从调用verifyKey 方法的位置运行。关闭对话框后,我找不到程序在代码中的位置,因为Log.d("After verifyInvalid key", "!!!!!!!!!!!!!!!!!"); 没有运行。我尝试从verifyKeyonClick 中返回一个布尔值,但它不允许从内部类中返回。我也收到了E/ViewRootImpl: sendUserActionEvent() mView == null

是否有返回此对话框的简单方法,或者我如何确保代码在从调用对话框时的位置运行时返回。

this.testContact = new Contacts("testCon", "08xxxxxxx", "testkey", true);
    // assign on click listener to button
    send_button.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View view) 
            //to send a message first an encryption key must be established
            if (testContact.getKeySet()) 
                verifyKey();
                if (keyChecker(verifyEnteredKey)) 
                    Log.d("Valid key", "!!!!!!!!!!!!!!!!!");
                    sendSms(testContact);
                 else 
                    Toast.makeText(getBaseContext(), "Invalid  Key",
                            Toast.LENGTH_LONG).show();
                
                Log.d("After verifyInvalid key", "!!!!!!!!!!!!!!!!!");

                Log.d("OUTSDIDE KEY CEHCK", "outside");
            
        //on click
    );
 public boolean keyChecker(String entKey) 
    if (entKey.equals(testContact.getKey())) 
        Log.d("Valid key", "key confirmed");
        return true;
    
    Log.d("inValid key", "key un-confirmed");
    return false;


public void verifyKey() 
    verifyEnteredKey = "";
    Builder builder = new Builder(SendMessage.this);
    builder.setTitle("Cloaked Key");
    // I'm using fragment here so I'm using getView() to provide ViewGroup
    // but you can provide here any other instance of ViewGroup from your Fragment / Activity
    View viewInflated = LayoutInflater.from(SendMessage.this).inflate(R.layout.key_entry_dialog, (ViewGroup) findViewById(android.R.id.content), false);
    // Set up the input
    final EditText input = viewInflated.findViewById(R.id.input);
    // Specify the type of input expected; this, for example, sets the input as a password, and will mask the text
    builder.setView(viewInflated);

    // Set up the buttons
    builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() 
        @Override
        public void onClick(DialogInterface dialog, int which) 
            verifyEnteredKey = input.getText().toString();
            Log.d("ENTERED KEYY in dialog", verifyEnteredKey);
            // if(verifyEnteredKey.equals(testContact.getKey()))
            //    return true;
            // 
            // keyChecker(verifyEnteredKey);
            Log.d("Before dialog dismiss", verifyEnteredKey);
            dialog.dismiss();
            Log.d("afteer dialog dismiss", verifyEnteredKey);

        

    );
    builder.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() 
        @Override
        public void onClick(DialogInterface dialog, int which) 
            dialog.cancel();
        
    );
    Log.d("Before builder show", verifyEnteredKey);
    builder.show();
    Log.d("After builder show", verifyEnteredKey);



【问题讨论】:

您不能从匿名类内部的方法返回。在这种情况下,您应该从内部类方法中进一步了解流程。您可以从内部类内部调用方法,也可以使用回调。见How to define callbacks。 感谢您从对话框中调用keyChecker(verifyEnteredKey);,然后从 keyChecker 方法中调用`sendSms(testContact);`。我唯一的问题是我想重新使用此方法(输入要发送的密钥和输入要查看消息的密钥),但这种方式不允许我这样做 为了代码的可重用性,您应该遵循设计模式。或者,您可以简单地从创建具有通用对象的 Utility 类开始。深入这个你会得到这个概念。祝你好运。 完美,非常有帮助。 【参考方案1】:

将此代码块移至onDismissListener https://developer.android.com/reference/android/content/DialogInterface.OnDismissListener.html

if (keyChecker(verifyEnteredKey)) 
                Log.d("Valid key", "!!!!!!!!!!!!!!!!!");
                sendSms(testContact);
             else 
                Toast.makeText(getBaseContext(), "Invalid  Key",
                        Toast.LENGTH_LONG).show();
    

本质上,您是在尝试在回调中分配值之前读取verifyEnteredKey

【讨论】:

以上是关于Android从对话框返回值的主要内容,如果未能解决你的问题,请参考以下文章

dialog-android怎么确定对话框返回的值是true还是false

启动对话框以获取结果以将值返回给主要活动

如何在android中的接口回调内部传输数据

打开系统位置设置后android对话框不会关闭

VB 中关于自定义对话框Dialog 的问题……

将字符串从对话框片段返回到活动 [重复]