警报框未显示在列表视图项上,单击“安卓”



我想在警报框中设置文本视图文本。我想制作倒计时框。我的代码如下:我的自定义警报框。

public abstract class ChallengeDialog extends AlertDialog.Builder implements OnClickListener {
    TextView msg;
 /**
  * @param context
  * @param title resource id
  * @param message resource id
  */
 public ChallengeDialog(Context context, String title, String message) {
  super(context);
  setTitle(title);
//  setMessage(message);
  msg = new TextView(context);
  msg.setText(message);
  setView(msg);
  setPositiveButton("accept", this); //In android this is OK button
  setNegativeButton("reject", this);//In android this is cancel button
 }
public void setDialogMsg(String m){
     msg.setText(m);
     setView(msg);
 }
 /**
  * will be called when "cancel" pressed.
  * closes the dialog.
  * can be overridden.
  * @param dialog
  */
 //This is cancel button
 public void onOkClicked(DialogInterface dialog) {
  dialog.dismiss();
 }
 @Override
 public void onClick(DialogInterface dialog, int which) {
  if (which == DialogInterface.BUTTON_POSITIVE) { 
    dialog.dismiss();
  } else {
      onOkClicked(dialog);
  }
 }
 /**
  * called when "ok" pressed.
  * @param input
  * @return true, if the dialog should be closed. false, if not.
  */
 //This is challenge button 
 abstract public boolean onCancelClicked(String input); 
}

使用自定义警报框的代码

ChallengeDialog chlngDialog = new ChallengeDialog(MyActivity.this,"title","count") {
                            @Override
                            public boolean onCancelClicked(String input) {
                                // TODO Auto-generated method stub
                                return false;
                            }
                        };
                        AlertDialog a = chlngDialog.show();

                        for(int i = 15 ; i>0 ;i--){
                            try {
                                chlngDialog.setDialogMsg("count "+i);
                                Thread.sleep(1000);
                            } catch (InterruptedException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }
                        }
//a.dismiss();

我正在单击列表视图执行此代码。但是警报框在 15 秒后显示,我单击了列表视图项目。我不知道为什么会这样?

您是否将

for 循环放入onItemClick侦听器中?

如果是,则创建一个异步任务并在侦听器onItemClick执行该任务。将 for 循环放入 doInBackground 中。

我最终得到了Android Coader建议的异步任务。下面是代码:

public abstract class MyDialog extends AlertDialog.Builder implements OnClickListener {
    TextView msgTxt;
    private static int count= 15 ;
    private String user;
    private int c;
 /**
  * @param context
  * @param title resource id
  * @param message resource id
  */
 public ChallengeDialog(Context context, String title, String message) {
  super(context);
  setTitle(title);
  setCancelable(false);
//  setMessage(message);
  msgTxt = new TextView(context);
  msgTxt.setText(message);
  setView(msgTxt);
  setPositiveButton("accept", this); //In android this is OK button
  setNegativeButton("reject", this);//In android this is cancel button
  MyTimerTask myTask = new MyTimerTask();
  myTask.execute(new String[] { "abc" });
 }
public void setUserAndBet(String u,int b){
        c= b;
        user = u ;
 }
 /**
  * will be called when "cancel" pressed.
  * closes the dialog.
  * can be overridden.
  * @param dialog
  */
 @Override
 public void onClick(DialogInterface dialog, int which) {
  if (which == DialogInterface.BUTTON_POSITIVE) { 
      onAcceptClicked(dialog);
//    dialog.dismiss();
  } else {
      onRejectClicked(dialog);
  }
 }
 /**
  * called when "ok" pressed.
  * @param input
  * @return true, if the dialog should be closed. false, if not.
  */
 //This is accept button 
 abstract public boolean onAcceptClicked(DialogInterface d);
 abstract public boolean onRejectClicked(DialogInterface d);
    Handler mHandler = new Handler() {
     @Override
     public void handleMessage(Message msg) {
        int countDownValue = (Integer)msg.obj;
        msgTxt.setText(countDownValue +" seconds");
        //call setText here
     }
    };

 class MyTimerTask extends AsyncTask<String, Void, String>{
        @Override
        protected String doInBackground(String... urls) {
          //mHandler.sendEmptyMessage(0);
          while(count > 0 ){
              Message msg = new Message();
              int countDownValue = count--;
              msg.obj = countDownValue;
              mHandler.sendMessage(msg);
              try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
          }
          return " ";

      }
 } 
}

只需创建此调用的对象并调用 show() 方法即可。谢谢Adndroid Coader