【问题标题】:AlertDialog won't show警报对话框不会显示
【发布时间】:2015-03-24 12:55:23
【问题描述】:

我正在尝试在我的代码中显示一个警报对话框。 它在构建时需要Context 作为其参数。 我希望它在我的LoginActivity 中弹出:

    public class LoginActivity extends ActionBarActivity
    { 
            // Methods inside         
    }

但是我生成alertDialog 的函数在一个单独的类中。因此,为了获得合适的Context,我尝试了一个额外的类,它给了我ApplicationContext,然后我将其用作所需的参数。

这是我生成alertDialog的函数:

    public static void alertFailure(String errorTitle, String errorMessage){
            Log.d("Alert Failure", "alerting failure");
            AlertDialog.Builder builder = new AlertDialog.Builder(MyApplication.getAppContext()); // Needs context of loginactivity
            builder.setTitle(errorTitle);
            builder.setMessage(errorMessage);
            builder.setPositiveButton("OK", new DialogInterface.OnClickListener(){
                @Override
                public void onClick(DialogInterface dialog, int which){

                }
            });
            AlertDialog alertDialog = builder.create();
            alertDialog.show();
    }

这是我用来获取ApplicationContext的课程:

    public class MyApplication extends Application{
        private static Context context;

        public void onCreate(){
            super.onCreate();
            MyApplication.context = getApplicationContext();
        }

        public static Context getAppContext(){
            return context;
        }
    }

当我记录我的程序时,我可以看到我的函数运行良好,但 alertDialog 没有弹出。如何将我的LoginActivityContext 作为参数传递?

【问题讨论】:

  • 我认为你应该将 Context 作为参数传递给alertFailure
  • 在 MyApplication 中,尝试以这种方式分配上下文:MyApplication.context = this;
  • 只做这个 AlertDialog.Builder builder = new AlertDialog.Builder(LoginActivity.this);
  • 那么你有什么解决办法吗??

标签: java android android-alertdialog android-context


【解决方案1】:

你可以重载方法

public static void alertFailure(Context context, String errorTitle, String errorMessage) {
 Log.d("Alert Failure", "alerting failure");
        AlertDialog.Builder builder = new AlertDialog.Builder(context); // Needs context of loginactivity
        builder.setTitle(errorTitle);
        builder.setMessage(errorMessage);
        builder.setPositiveButton("OK", new DialogInterface.OnClickListener(){
            @Override
            public void onClick(DialogInterface dialog, int which){

            }
        });
        AlertDialog alertDialog = builder.create();
        alertDialog.show();
}

并称它为NomeClass.alertFailure(LoginActivity.this, "title", "message");

你可以在没有上下文的情况下保留版本:

public static void alertFailure(String errorTitle, String errorMessage){
      alertFailure(MyApplication.getContext(), erroTitle, errorMessage);
 }

【讨论】:

  • 当我使用“LoginActivity.this”时,它表示该活动不是封闭类。
  • 你是从静态方法调用它吗?
  • 是的,我的函数定义为静态
  • 那你就无权进入外部环境
  • 所以如果我将它公开并创建一个对象来使用我的方法,它应该可以正常工作吗?
【解决方案2】:

尝试替换这个..

AlertDialog alertDialog = builder.create();
        alertDialog.show();

有了这个..

builder.show();

【讨论】:

    【解决方案3】:

    您需要对话框的活动上下文。应用上下文不行。

    您可以将其作为参数传递给方法,例如

    public static void alertFailure(Activity context, String errorTitle, String errorMessage){
    

    并从活动中调用:

    AnotherClass.alertFailure(this, ...);
    

    【讨论】:

      【解决方案4】:

      在 alertFailure() 中添加另一个参数作为 ActivityContext,然后从 LoginActivity 类中调用 alertFailure("Alert Failure", "alerting failure", LoginActivity.this);

      【讨论】:

        【解决方案5】:

        我认为Context 没有问题。

        像这样拨打alertFailure

        new Handler().post(new Runnable() {
            @Override
            public void run() {
                alertFailure("Title", "Message");
            }
        });
        

        【讨论】:

          猜你喜欢
          • 2020-01-14
          • 1970-01-01
          • 1970-01-01
          • 2023-03-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多