Android Can';t在AlertDialog中更改最终变量

Android Can';t在AlertDialog中更改最终变量,android,boolean,Android,Boolean,我有以下代码(这不是完整的代码,但其余的都不重要)。我试图根据用户在Alertdialog中选择的内容将布尔值“ignoreLength”设置为true或false。但是,当代码如下所示时,我得到以下错误: “无法在其他方法中定义的内部类内引用非最终变量ignoreLength” 当我将其设置为最终版本时,它将更改为: 无法指定最终局部变量ignoreLength,因为它是在封闭类型中定义的 我怎样才能更改ignoreLength package com.grawl.passgen; impo

我有以下代码(这不是完整的代码,但其余的都不重要)。我试图根据用户在Alertdialog中选择的内容将布尔值“ignoreLength”设置为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());
        }
    });

    }

}
package com.grawl.passgen;
导入android.app.Activity;
导入android.app.AlertDialog;
导入android.content.DialogInterface;
导入android.os.Bundle;
导入android.view.view;
导入android.widget.Button;
导入android.widget.EditText;
导入android.widget.Toast;
公共类PassGenActivity扩展了活动{
/**在首次创建活动时调用*/
@凌驾
创建时的公共void(Bundle savedInstanceState){
//接口——默认值
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//接口——自定义
最终按钮Button_generate=(按钮)findViewById(R.id.Button_generate);
最终EditText_pass=(EditText)findViewById(R.id.textPassWord);
最终编辑文本编辑长度=(EditText)findViewById(R.id.editLength);
//设置阵列
最后一个字符串[]小写;
最后一个字符串[]大写;
最终字符串[]个数字;
最终字符串[]符号;
//填充数组
createArray characters=新建createArray();
小写=字符。getArrayLower();
大写=字符。getArrayUpper();
数字=字符。getArrayNumbers();
符号=字符。getArraySymbols();
//按下按钮,呜呜!
按钮_generate.setOnClickListener(新视图.OnClickListener(){
**布尔值ignoreLength=false**
公共void onClick(视图v){
//设置参数
boolean lowerCaseEnabled=true;//需要接口选项
布尔upperCaseEnabled=true;//需要接口选项
boolean NumberEnabled=true;//需要接口选项
布尔符号Enabled=true;//需要接口选项
//根据EditText的输入设置长度
整数长度=0;
试一试{
length=Integer.parseInt(编辑_length.getText().toString());
}捕获(NumberFormatException nfe){
Toast.makeText(PassGenActivity.this,“无法解析”+nfe,Toast.LENGTH\u LONG.show();
}
如果(长度<1){
长度=1;
编辑_length.setText(“1”);
Toast.makeText(PassGenActivity.this,“密码长度不能小于1,请将其设置为1.”,Toast.length_LONG.show();
};
如果(长度>100){
AlertDialog.Builder alert=新建AlertDialog.Builder(PassGenActivity.this);
警报。设置标题(“警告”);
setMessage(“您正在尝试创建一个很长的密码,确定吗?”);
alert.setPositiveButton(“是”,新的DialogInterface.OnClickListener(){
public void onClick(对话框接口对话框,int whichButton){
ignoreLength=true;
}
});
alert.setNegativeButton(“否”,空);
alert.show();
}
密码=新密码();
输入密码(小写、大写、数字、符号);
//生成密码
password.setPassword(启用小写、启用大写、启用numbersEnabled、启用符号、长度);
text_pass.setText(password.getPassword());
}
});
}
}

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

正如您所清楚的那样,final变量永远不能更改,因为它是final,并且在创建时已声明


同样在您的案例中,
boolean ignoreLength=false在click listener外部和之前声明变量,不要将其设为最终变量。因为您将来需要更新ignoreLength值。

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

正如您所清楚的那样,final变量永远不能更改,因为它是final,并且在创建时已声明


同样在您的案例中,
boolean ignoreLength=false在click listener外部和之前声明变量,不要将其设为最终变量。因为您将来需要更新ignoreLength值。

您不能从内部类型重新分配java中的局部变量

有两种方法可以解决你的问题。 1) 将ignore case设置为某个字段——实际上可以使用anonymous OnClickListener类型,并将其设置为ignoreLength字段,但我认为通常您希望它是顶级类上的字段

2)


不能从内部类型重新分配java中的局部变量

有两种方法可以解决你的问题。 1) 将ignore case设置为某个字段——实际上可以使用anonymous OnClickListener类型,并将其设置为ignoreLength字段,但我认为通常您希望它是顶级类上的字段

2)


您可以移动
布尔ignoreLength声明,使其成为匿名OnClickListener类的成员变量


此外,您可以将变量放在保存它的东西中(比如一个包含一个项的数组),并以这种方式进行更新
ignoreLength[0]=true

您可以移动
布尔ignoreLengthonClick外部的声明,使其成为匿名OnCli的成员变量
final boolean[] ignoreLengthHolder= new boolean[]{ false };
...
ignoreLengthHolder[0] = true