Не могу изменить конечную переменную внутри AlertDialog - PullRequest
0 голосов
/ 03 апреля 2012

У меня есть следующий код (это не полный код, но остальное не имеет значения). Я пытаюсь установить для логического значения ignoreLength значение true или false в зависимости от того, что пользователь выбирает в Alertdialog. Однако, когда код такой, я получаю эту ошибку:

"Невозможно обратиться к неконечной переменной 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 ]

1 голос
/ 03 апреля 2012

Вы не можете переназначать локальные переменные в Java из внутреннего типа. Подробнее здесь.

Есть два способа решить вашу проблему. 1) Сделайте ignore case полем для чего-либо - вы могли бы фактически использовать анонимный тип OnClickListener и присвоить ему поле ignoreLength, но я думаю, что в общем случае вы хотели бы, чтобы оно было полем класса верхнего уровня

2)

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

1 голос
/ 03 апреля 2012

Вы можете переместить объявление boolean ignoreLength; за пределы onClick, чтобы сделать его переменной-членом анонимного класса OnClickListener.

Кроме того, вы можете поместить переменную в то, что содержит ее (например, в массив содин элемент) и обновить его таким образом.ignoreLength[0] = true;

1 голос
/ 03 апреля 2012

Во-первых, согласно вашему вопросу.«Невозможно изменить конечную переменную внутри AlertDialog» неверно .

Как поясняется, что переменная final никогда не может быть изменена, поскольку она окончательная и уже объявлена ​​ввремя создания.

Также в вашем случае boolean ignoreLength = false; объявляйте переменную снаружи и перед слушателем щелчка и не делайте ее окончательной.Как вам нужно обновить значение ignoreLength в будущем.

...