内部类中的最终变量问题

时间:2012-04-19 20:44:41

标签: android null

你能告诉我这里的错误是什么吗?它告诉我吐司中的“性别”必须设置为最终,但是当我这样做时,if语句会抱怨它不应该是最终的

@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);
        }
    });




}




}

4 个答案:

答案 0 :(得分:4)

您无法从内部类访问本地非最终变量。一个简单的解决方法是在设置性别的初始值后获取另一个最终变量。这样做:

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();

还有其他方法可以做到,但这是最快的。

答案 1 :(得分:1)

错误是:

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

应该是

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

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

答案 2 :(得分:1)

你在onclick toast中缺少.show():

      public void onClick(View v) {

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

答案 3 :(得分:1)

你有太多的错误可以完全解决。它们包括:

  1. 你从按钮中获取文本到变量,然后你写出文字字符串“男性”和“女性”无论如何。
  2. 您从男性按钮抓取文本两次,而不是女性按钮。
  3. 在类中声明您的变量,而不是在onCreate方法中,并且它们会表现得更好,没有关于最终的问题等等。
  4. 检查男性和女性按钮的if语句必须位于onClick(v)方法内。如果它们在外面,那么点击不会导致它们被重新评估,并且更改按钮的数量不会改变您获得的结果。
  5. gender已经是一个字符串,gender.toString()没有做任何改变。
  6. RadioButton并不真正做你想要的,你可能想要ToggleButton。
  7. 您可能想要放入一些逻辑,因此一次只能检查一个男性或女性按钮。他们每个人都需要一个OnClickListener才能做到这一点。
  8. 说了这么多,这里的代码中有很多变化,可能还有其他一些东西被清理了一下。

    祝你好运!

    公共类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();
               }
           });
       }
    

    }