2012-04-03 4 views
0

다음 코드가 있습니다 (전체 코드는 아니지만 나머지는 중요하지 않습니다). 부울 "ignoreLength"를 true 또는 false로 설정하려고합니다. 사용자가 Alertdialog에서 선택한 항목을 기반으로합니다.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()); 
     } 
    }); 

    } 

} 
+0

decalare 부울 ignoreLength = false; 클릭 리스너의 외부 및 앞에서 변경해야하므로 마지막으로하지 마십시오 –

+0

클릭 수신기 외부에서이를 변경하면 동일한 오류가 발생합니다. – Grawl

답변

1

처음 질문대로 "AlertDialog에서 최종 변수를 변경할 수 없습니다"입니다.

최종 변수는 최종적으로 변경 될 수 없으며 작성 시점에 이미 선언 된 것입니다.

또한 boolean ignoreLength = false; 변수를 클릭 수신기 외부 및 클릭 수신기 앞에 선언하고 최종적으로 선언하지 마십시오. 나중에 ignoreLength 값을 업데이트해야합니다.

+0

그 변경 사항과 함께 전체 코드를 추가했습니다. 문제를 해결하지는 못합니다. 오류는 동일합니다. – Grawl

+0

오류를 OnClickListener 내에서 정의하지만 실제 onClick 전에 오류를 제거했습니다. 거짓 button_generate.setOnClickListener (새 View.OnClickListener() { \t 부울 ignoreLength =; \t 공공 무효 온 클릭 (보기 V) { – Grawl

+0

개인 부울 ignoreLength = 허위로 선언하며 PassGenActivity에 자신의 변수로. ...................... 당신이 무슨 뜻인지 이해하고 있어요. 괜찮아요. .. –

1

java의 로컬 변수를 내부 유형에서 재 할당 할 수 없습니다. More here.

두 가지 방법으로 문제를 해결할 수 있습니다. 1) 무언가에 필드를 대문자로 무시하도록하십시오. 실제로 익명의 OnClickListener 유형을 사용할 수 있으며 ignoreLength 필드를 제공 할 수 있지만 일반적으로 최상위 클래스의 필드가되기를 원합니다.

2)
<superuglyhack>

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

</superuglyhack>

1

당신은 익명에의 멤버 변수 만들기 위해 온 클릭의 외부 boolean ignoreLength; 선언을 움직일 수 ClickListener 클래스입니다.

또한 변수를 보유하고있는 항목 (예 : 항목이 하나 인 배열)에 변수를 넣고 그런 식으로 업데이트 할 수 있습니다. ignoreLength[0] = true;

관련 문제