【问题标题】:final variable issue in an inner class内部类中的最终变量问题
【发布时间】:2012-04-19 20:44:41
【问题描述】:

你能告诉我这里的错误是什么吗?它告诉我 toast make 中的“gender”必须设置为 final,但是当我这样做时,if 语句抱怨它不应该是 final

@Override
protected void onCreate(Bundle savedInstanceState) {

    String gender = null;

    Toast.makeText(this, R.string.ok, Toast.LENGTH_LONG).show();
super.onCreate(savedInstanceState);
setContentView(R.layout.createprofile);



    RadioButton rb_male = (RadioButton) findViewById(R.id.maleradiobutton);
String   male=rb_male.getText().toString();

    RadioButton rb_female = (RadioButton) findViewById(R.id.femaleradiobutton);
    String female=rb_male.getText().toString();

    if(rb_male.isChecked()) { gender = "male";}
    if(rb_female.isChecked()){ gender = "female";}

    Button checkgender = (Button) findViewById(R.id.gendercheck);
    checkgender.setOnClickListener(new View.OnClickListener() {

        public void onClick(View v) {

            Toast.makeText(ProfileActivity.this, gender.toString(), Toast.LENGTH_LONG);
        }
    });




}




}

【问题讨论】:

    标签: android null


    【解决方案1】:

    您不能从内部类访问局部非 final 变量。一种简单的解决方法是在设置性别的初始值后采用另一个最终变量。这样做:

    if(rb_male.isChecked()) { gender = "male";}
    if(rb_female.isChecked()){ gender = "female";}
    final String finalGender = gender;
    

    以后

    Toast.makeText(ProfileActivity.this, finalGender.toString(), Toast.LENGTH_LONG).show();
    

    还有其他方法,但这是最快的。

    【讨论】:

    • 小修正,非最终局部变量(在方法内部定义)。可以访问非最终实例变量。
    • 谢谢,它运行了,但是吐司一直给我“男性”!
    • 请您更正一下,因为我仍然看不到错误
    • 我提供的代码是正确的。如果你总是得到“男性”,这意味着 rb_male.isChecked() 总是返回 true。为了确保这一点,只需在使用 Log.d("CheckGender", "Gender is " + gender); 设置后记录值。该消息将打印在 LogCat 控制台中。
    • 我用性别或最终性别做日志(当我用性别做日志时,它会给我最终的错误)?
    【解决方案2】:

    您有太多错误,无法真正完全解决。它们包括:

    1. 您将按钮中的文本抓取到变量中,然后写出文字字符串“男性”和“女性”。
    2. 您从男性按钮抓取文本两次,而不是女性按钮。
    3. 在类中声明您的变量,而不是在 onCreate 方法中,它们的行为会好得多,而且不会出现最终问题等问题。
    4. 检查男性和女性按钮的if 语句必须在方法onClick(v) 中。如果它们在外面,那么单击不会导致重新评估它们,并且无论更改多少按钮都不会改变您获得的结果。
    5. gender 已经是一个字符串,gender.toString() 没有任何改变。
    6. RadioButton 并没有真正做到你想要的,你可能想要 ToggleButton。
    7. 您可能想要添加一些逻辑,以便一次只能检查一个按钮男性或女性。他们每个人都需要一个 OnClickListener 来执行此操作。

    说了这么多,这里的代码做了很多修改,可能还有一些其他的东西清理了一些。

    祝你好运!

    公共类 AndroidTest 扩展 Activity {

       String gender = null;
       RadioButton rb_male;
       RadioButton rb_female;
       Button checkgender;
    
       @Override
       protected void onCreate(Bundle savedInstanceState) {
    
           Toast.makeText(this, "OK", Toast.LENGTH_LONG).show();
           super.onCreate(savedInstanceState);
           setContentView(R.layout.main);
    
           rb_male = (RadioButton) findViewById(R.id.maleradiobutton);
           rb_female = (RadioButton) findViewById(R.id.femaleradiobutton);
    
           checkgender = (Button) findViewById(R.id.gendercheck);
           checkgender.setOnClickListener(new View.OnClickListener() {
    
               public void onClick(View v) {
                   if (rb_male.isChecked()) {
                       gender = "male";
                   }
                   if (rb_female.isChecked()) {
                       gender = "female";
                   }
                   Toast.makeText(AndroidTest.this, (CharSequence) gender, Toast.LENGTH_LONG).show();
               }
           });
       }
    

    }

    【讨论】:

      【解决方案3】:

      错误是:

      Toast.makeText(ProfileActivity.this, gender.toString(), Toast.LENGTH_LONG);
      

      应该是

      Toast.makeText(v.getContext(), gender.toString(), Toast.LENGTH_LONG).show();
      

      您还可以将性别设置为类范围变量,以便您可以使用 setter/getter 访问它

      【讨论】:

      • 它仍然给我同样的错误,基本上你所做的是添加 .show() 但我的问题与 GUI 无关.. 它是关于变量性别的定义
      【解决方案4】:

      onclick toast 中缺少 .show():

            public void onClick(View v) {
      
                          Toast.makeText(ProfileActivity.this, gender.toString(), 
      Toast.LENGTH_LONG).show();
                      }
                  });
      

      【讨论】:

      • 它仍然给我同样的错误,基本上你所做的是添加 .show() 但我的问题与 GUI 无关.. 它是关于变量 gender 的定义
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-12-08
      • 1970-01-01
      • 2013-01-03
      • 2017-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多