即使我在Android上调用onCreateDialog,也不会创建AlertDialog

时间:2011-08-31 20:13:48

标签: android android-alertdialog

我面临以下问题。

我有一张图片Gallery,我想打开AlertDialog以显示有关所点击图片的一些信息。我第一次点击图片,它运行得很好。但是接下来的几次,即使我点击不同的图像,同样的对话框也会出现。

UserCase

当我关注此用户案例时

  1. 选择位置2的图像
  2. 关闭对话框
  3. 选择位置6的图像
  4. 关闭对话框
  5. ,我得到了这些照片:

    click na galeria... position: 2
    startUserInformationDialog()... `this.position`: 2
    onCreateDialog on switch.. `this.position`: 2
    DISMISSING DIALOG `this.position`: 2
    
    click na galeria... position: 6
    startUserInformationDialog()... `this.position`: 6
    DISMISSING DIALOG `this.position`: 6
    

    这意味着代码未通过 onCreateDialog

    运行

    CODE

    public AlertDialog createUserInformationAlertDialog() {
            LayoutInflater inflater = getLayoutInflater();
            View dialoglayout = inflater.inflate(R.layout.dialog_user_info,
                    (ViewGroup) findViewById(R.id.dialog_user_layout_root));
            AlertDialog.Builder builder = new AlertDialog.Builder(this);
            builder.setView(dialoglayout);
            final MyObject ea = myList.get(positionUserToHaveInformationDisplayedOnTheDialog);
                // Setting values according to element to be shown
                TextView textView = (TextView) dialoglayout
                        .findViewById(R.id.user_name_value);
                textView.setText(ea.getName());
                ...
                builder.setNegativeButton(Locale_PT_BR.BACK,
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog,
                                    int whichButton) {
                                Log.d("PRINT 1",
                                        "DISMISSING DIALOG `this.position`: "
                                                + positionUserToHaveInformationDisplayedOnTheDialog);
                                dialog.dismiss();
                            }
                        });
                return builder.create();
    }
    
    
    private void startUserInformationDialog() {
        Log.d("PRINT 2", "startUserInformationDialog()... `this.position`: "
                + positionUserToHaveInformationDisplayedOnTheDialog);
        showDialog(DIALOG_USER_INFORMATION);
    }
    
    
    
    @Override
        protected Dialog onCreateDialog(int id) {
            switch (id) {
            case DIALOG_USER_INFORMATION:
                Log.d("PRINT 3", "onCreateDialog on switch.. `this.position`: "
                        + positionUserToHaveInformationDisplayedOnTheDialog);
                return createUserInformationAlertDialog();
            default:
                return null;
            }
        }
    
    private void startGallery() {
            myPhotoBar = (Gallery) findViewById(R.id.gallery);
            myPhotoBar.setOnItemClickListener(new OnItemClickListener() {
                public void onItemClick(AdapterView parent, View v, int position,
                        long id) {
                    Log.d("PRINT 4", "click na galeria... position: " + position);
                    positionUserToHaveInformationDisplayedOnTheDialog = position;
                    startUserInformationDialog();
                }
            });
    
    }
    

4 个答案:

答案 0 :(得分:4)

使用onPrepareDialog()方法填充数据对话框。如果要销毁对话框,则应调用removeDialog()方法。

答案 1 :(得分:1)

我相信如果ID相同,showDialog只调用onCreateDialog一次。如果要更新已创建的对话框,可以覆盖onPrepareDialog,以便在向用户显示之前更新您喜欢的内容。

答案 2 :(得分:1)

没关系,因为如果你看到doc,就会在第一时间调用onCreateDialog。

“当第一次请求对话框时,Android会从您的Activity调用 onCreateDialog(int),这是您应该实例化Dialog的地方。此回调方法传递给您传递给showDialog(int)的相同ID。创建对话框后,返回方法末尾的对象。“

您需要知道这将创建一次。

致电 onPrepareDialog

“在显示对话框之前,Android还会调用onPrepareDialog(int,Dialog)上的可选回调方法。如果要在每次打开时更改对话框的任何属性,请定义此方法每次打开对话框时都会调用此方法而onCreateDialog(int)仅在第一次打开对话框时调用。如果没有定义onPrepareDialog( ),然后对话框将保持与上一次打开时相同。此方法还传递对话框的ID,以及您在onCreateDialog()中创建的Dialog对象。“

答案 3 :(得分:0)

您可以试试simple android dialog popup library。在您的活动中使用非常简单。

如果你不需要复杂的功能,只需要一行代码即可创建对话框。

Pop.on(activity).with().title(R.string.title).body(R.string.body).show();

只需在gradle依赖项中包含以下lib

dependencies {
    compile 'com.vistrav:pop:2.0'
}