无法更改AlertDialog中的最终变量

时间:2012-04-03 19:24:15

标签: android boolean

我已经获得了以下代码(它不是完整的代码,但其余的并不重要)。我试图设置布尔值" ignoreLength"根据用户在Alertdialog中选择的内容,为true或false。但是,当代码是这样的时候,我收到了这个错误:

"不能在不同方法中定义的内部类中引用非最终变量ignoreLength"

当我最终完成时,它会改为:

"无法分配最终的局部变量ignoreLength,因为它是在封闭类型中定义的"

我怎样才能做到这样我可以改变ignoreLength?

package com.grawl.passgen;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class PassGenActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {

    // Interface -- Default

    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    // Interface -- Custom

    final Button button_generate = (Button) findViewById(R.id.button_generate);
    final EditText text_pass = (EditText) findViewById(R.id.textPassWord);
    final EditText edit_length = (EditText) findViewById(R.id.editLength);

    // Set up Arrays

    final String[] lowerCase;
    final String[] upperCase;
    final String[] numbers;
    final String[] symbols;

    // Fill Arrays

    createArray characters = new createArray();
    lowerCase = characters.getArrayLower();
    upperCase = characters.getArrayUpper();
    numbers = characters.getArrayNumbers();
    symbols = characters.getArraySymbols();


    // Pressing the button WOOOSH!

    button_generate.setOnClickListener(new View.OnClickListener() {

        **boolean ignoreLength = false;**

        public void onClick(View v) {

            // Set up parameters

            boolean lowerCaseEnabled = true; // needs interface option
            boolean upperCaseEnabled = true; // needs interface option
            boolean numbersEnabled = true; // needs interface option
            boolean symbolsEnabled = true; // needs interface option

            // Set up length based on input from EditText

            int length = 0;

            try {
                length = Integer.parseInt(edit_length.getText().toString());
            } catch(NumberFormatException nfe) {
                Toast.makeText(PassGenActivity.this, "Can't parse " + nfe, Toast.LENGTH_LONG).show();
            }

            if (length < 1) {
                length = 1; 
                edit_length.setText("1");
                Toast.makeText(PassGenActivity.this, "Password length can't be less than 1, set it to 1.", Toast.LENGTH_LONG).show();
                };

            if (length > 100) {
                AlertDialog.Builder alert = new AlertDialog.Builder(PassGenActivity.this);

                alert.setTitle("Warning");
                alert.setMessage("You are trying to create quite a long password, are you sure?");

                alert.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int whichButton) {
                      ignoreLength = true;
                      }
                    });


                alert.setNegativeButton("No", null);
                alert.show();  
            }

            Password password = new Password();
            password.fillPassword(lowerCase, upperCase, numbers, symbols);

            // Generate password

            password.setPassword(lowerCaseEnabled, upperCaseEnabled, numbersEnabled, symbolsEnabled, length);
            text_pass.setText(password.getPassword());
        }
    });

    }

}

3 个答案:

答案 0 :(得分:1)

首先根据你的问题。 “无法更改AlertDialog中的最终变量”错误

明确表示最终变量永远不能更改,因为它是最终的,并且在创建时已经声明。

同样在你的情况下boolean ignoreLength = false;在点击监听器之外和之前声明变量,并且不使其成为最终变量。因为您需要在将来更新ignoreLength值。

答案 1 :(得分:1)

您无法从内部类型重新分配java中的局部变量。 More here.

有两种方法可以解决您的问题。 1)忽略大小写一个字段 - 你实际上可以使用匿名OnClickListener类型,并给它ignoreLength字段,但我认为通常你会希望它是顶级类的字段

2)
&LT; superuglyhack&GT;

final boolean[] ignoreLengthHolder= new boolean[]{ false };
...
ignoreLengthHolder[0] = true

&LT; / superuglyhack&GT;

答案 2 :(得分:1)

您可以在onClick之外移动boolean ignoreLength;声明,使其成为匿名OnClickListener类的成员变量。

此外,您可以将变量放在保存变量的位置(如带有一个项目的数组)并以此方式更新。 ignoreLength[0] = true;