Java 从alertDialog内的onClickListener访问全局变量

Java 从alertDialog内的onClickListener访问全局变量,java,android,global-variables,onclicklistener,Java,Android,Global Variables,Onclicklistener,在标记行str中,要求我将str设置为局部变量 public void alertShow(String s){ //Game Ended...!!! android.support.v7.app.AlertDialog.Builder alertDialog = new android.support.v7.app.AlertDialog.Builder(this); // Setting Dialog Title if(s.equals("You") ||

在标记行
str
中,要求我将
str
设置为局部变量

public void alertShow(String s){
    //Game Ended...!!!
    android.support.v7.app.AlertDialog.Builder alertDialog = new android.support.v7.app.AlertDialog.Builder(this);

    // Setting Dialog Title
    if(s.equals("You") || (s.contains("P")))
        alertDialog.setTitle("Congratulations...");
    else
        alertDialog.setTitle("Game's Up...");

    // Setting Dialog Message
    if(s.equals("You") || s.contains("P"))
        alertDialog.setMessage(s+" Win The Game...");
    else
        alertDialog.setMessage("You Lose... I Win...");

    final ImageView img = new ImageView(this);
    if(s.equals("You") || (s.contains("P")))
        img.setImageResource(R.drawable.firecrackers);
    else
        img.setImageResource(R.drawable.mmm);

    alertDialog.setView(img);

    // Setting Dialog Cancellation
    alertDialog.setCancelable(false);

    // Setting Positive "Yes" Button

    //==================Here Problem Starts==========================

    SessionClass sessionClass = new SessionClass();
    final String str = sessionClass.getPlayer();
    alertDialog.setPositiveButton("Try Again", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int which) {
            Intent i;
            if (str.contains("1"))
                i = new Intent(MainActivity2.this, Toss.class);
            else
                i = new Intent(MainActivity2.this, Game2.class);
            startActivity(i);
            finish();
        }
    });

    //=====================================================

    // Setting Negative "NO" Button
    alertDialog.setNegativeButton("Main Menu", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int which) {
            Intent i = new Intent(MainActivity2.this, MainActivity2.class);
            startActivity(i);
            finish();
        }
    });

    // Showing Alert Message
    alertDialog.show();
}
我想从onClickListener访问str,它在onClickListener外部声明。
我尝试了以下代码,但它没有访问变量。

您需要将
str
变量标记为
final
,然后您可以从

访问封闭范围的局部变量,并声明和访问匿名类的成员

与本地类一样,匿名类可以捕获变量;它们对封闭范围的局部变量具有相同的访问权限:

匿名类可以访问其封闭类的成员

匿名类无法访问其封闭范围内未声明为final或有效final的局部变量。


将字符串标记为
final
,然后您就可以使用它了。

final应该允许您在AlertDialog中访问变量, 您能确认您确实从这个方法(getPlayer();)中获得了字符串吗


我问这个问题的原因是(您没有检查null),如果该方法返回null,那么当您想要检查null是否为“1”时,您将得到错误。

make
str
String
final
尝试了@ρ∑ѕρєK,但不幸的是没有工作。现在我将使用final编辑代码。什么不起作用?您收到了什么消息?您不能将
str
设置为
public
来代替
SessionClass SessionClass=new SessionClass()它将是
SessionClass SessionClass=(SessionClass)getApplicationContext()
尝试了@VivekSingh,但不幸的是没有成功。现在我将使用final编辑代码。您现在面临的问题是什么。任何编译问题或运行时问题?您的
str
变量的作用域是什么?该作用域将是清除
str
的函数,但由于
onClickListener
是一个类,因此它无法从那里访问
str
。因此,我正在寻找另一种访问它的方法。您在这里提供的代码是否采用了相同的方法?尝试了@SURESH,但不幸的是没有起作用。现在我将使用final.In代替
SessionClass SessionClass=new SessionClass()编辑代码它将是
SessionClass SessionClass=(SessionClass)getApplicationContext()
yes,
getPlayer()
方法已在较早时用于返回字符串“1 Player”或“2 Player”的应用程序中。很高兴在结尾时它正常工作,但失望的是您没有选择此作为答案或至少对此进行了投票,因为我想我提到的最终结果会起作用,而且你的方法会得到空值,看起来是这样的,无论如何,请下次在你回复答案之前检查一下。对此我非常抱歉。我不能投票,因为我是新来的,你们两个同时回答。并且同样地帮助了我。我成了最笨的人,因为我没有检查那4个特定的活动。我的代码中也有一个错误,这就是显示null的原因。这就代替了SessionClass=newsessionclass()它将是
SessionClass SessionClass=(SessionClass)getApplicationContext()无纠正。我自己纠正了。这才是真正的原因。非常感谢你对我的帮助。下次我一定会查你的。