【问题标题】:How to close dialog from withing onClickListener如何从 onClickListener 中关闭对话框
【发布时间】:2014-03-06 17:53:40
【问题描述】:

我已经将AlertDialog.Builder 设置为final

我在对话框中有一个按钮,单击该按钮会为用户进行购买然后关闭。我在“关闭”部分遇到问题。这是按钮的代码:

    Button buyButton = new Button(context);
    LinearLayout.LayoutParams buttonParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, 100, 0.0f);
    buyButton.setLayoutParams(buttonParams);
    buyButton.setOnClickListener(new Button.OnClickListener() {
        @Override
        public void onClick(View view){
            if (STOCK_TO_PURCHASE.size() != 0) {
                Player thisPlayer = players[getPlayerIndexByPlayOrder(CURRENT_TURN)];
                purchaseStock(thisPlayer);
                buyStockDialog.dismiss();
            } else {
                buyStockDialog.dismiss();
            }
        }
    });

IDE 告诉我必须对 buyStockDialog 进行类型转换。但是,如果我对它进行类型转换,我会收到一个运行时错误,告诉我无法将 buyStockDialog 类型转换为 DialogInterface

处理这个问题的最佳方法是什么?

我已经有一个自定义的onBackPressed 方法并考虑强制应用程序模仿被按下的后退按钮。您认为这里最好的解决方案是什么?

AlertDialog.Builder 根据请求的声明行:

    ContextThemeWrapper ctw = new ContextThemeWrapper(this, R.style.AppTheme);
    final AlertDialog.Builder buyStockDialog = new AlertDialog.Builder(ctw);
    buyStockDialog.setTitle("Buy Stock: ");

根据第二个请求,完整对话框的代码和布局:

public void buyStock(View view){
    Context context = getApplicationContext();
    ContextThemeWrapper ctw = new ContextThemeWrapper(this, R.style.AppTheme);
    final AlertDialog.Builder buyStockDialog = new AlertDialog.Builder(ctw);
    buyStockDialog.setTitle("Buy Stock: ");

    //create ScrollView to hold everything
    ScrollView scrollView = new ScrollView(context);

    //generate content for dialog       
    LinearLayout dialogContainer = new LinearLayout(context);
    dialogContainer.setOrientation(LinearLayout.VERTICAL);
    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, 350, 1);
    params.gravity = Gravity.CENTER;
    dialogContainer.setLayoutParams(params);
    dialogContainer.setPadding(15, 15, 0, 15);
    dialogContainer.setBackgroundColor(Color.WHITE);

    //each hotel stock options
    for (int i = 0; i < hotels.size(); i++) {
        Hotel testHotel = hotels.get(i);
        testHotel.setPrice(200);
        View stockPicker = getStockPicker(testHotel);
        LinearLayout.LayoutParams pickerParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, 75, 1.0f);
        pickerParams.gravity = Gravity.LEFT;
        stockPicker.setLayoutParams(pickerParams);
        dialogContainer.addView(stockPicker);
        stockPicker.setBackgroundColor(0xffffff);
    }

    LinearLayout scrollWrapper = new LinearLayout(context);
    scrollWrapper.addView(scrollView);
    scrollWrapper.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, 300, 1.0f));

    scrollView.addView(dialogContainer);
    scrollView.setLayoutParams(params);

    LinearLayout dialogLayout = new LinearLayout(context);
    dialogLayout.setOrientation(LinearLayout.VERTICAL);
    dialogLayout.setBackgroundColor(Color.WHITE);

    Button buyButton = new Button(context);
    LinearLayout.LayoutParams buttonParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, 100, 0.0f);
    buyButton.setLayoutParams(buttonParams);
    buyButton.setOnClickListener(new Button.OnClickListener() {
        @Override
        public void onClick(View view){
            if (STOCK_TO_PURCHASE.size() != 0) {
                Player thisPlayer = players[getPlayerIndexByPlayOrder(CURRENT_TURN)];
                purchaseStock(thisPlayer);
                buyStockDialog.dismiss();
            } else {
                buyStockDialog.dismiss();
            }
        }
    });

    dialogLayout.addView(scrollWrapper);
    dialogLayout.addView(buyButton);

    buyStockDialog.setView(dialogLayout);

    buyStockDialog.setOnCancelListener(new DialogInterface.OnCancelListener() {         
        @Override
        public void onCancel(DialogInterface dialog) {
            int numInterations = STOCK_TO_PURCHASE.size();
            for (int i = 0; i < numInterations; i++) {
                STOCK_TO_PURCHASE.remove(0);
            }
        }
    });

    buyStockDialog.show();

}

【问题讨论】:

  • buyStockDialog 是 AlertDialog.Builder 吗?
  • 能否包含buyStockDialog 的声明行。
  • 添加了声明行
  • 这个按钮是对话框布局的一部分吗?您能否在此处提供显示方法代码的完整对话框

标签: android button dialog onclick


【解决方案1】:

AlertDialog 有区别,它有一个dismiss() 函数。还有 AlertDialog.Builder,它是警报对话框的构建器模式。当您即将显示您调用的对话框时

buyStockDialog.create()

那里的返回值是你必须调用dismiss的那个。

【讨论】:

  • 这是一个有效的努力,但 buyStockDialog.create().dismiss() 不起作用。它没有给我任何错误,但也没有关闭对话框。
  • 那是因为现在您正在创建一个从未显示的新对话框,然后关闭该对话框。在你显示对话框的地方……你已经调用了 buyStockDialog.create().show() 的地方。那是你需要注意的对象。 buyStockDialog 只是构建器。它不重要,您不应该记住它或尝试在第一次创建之外使用它。
【解决方案2】:

你必须在声明对话框的地方做这样的事情:

ContextThemeWrapper ctw = new ContextThemeWrapper(this, R.style.AppTheme);
AlertDialog.Builder buyStockDialog = new AlertDialog.Builder(ctw);
buyStockDialog.setTitle("Buy Stock: ");
final Dialog dialog = builder.create();

在您想要关闭对话框的点击侦听器中,您将调用它:

dialog.dismiss();

【讨论】:

    猜你喜欢
    • 2011-04-04
    • 2011-02-25
    • 1970-01-01
    • 2019-08-13
    • 2012-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多