programing

변수는 내부 클래스 내에서 액세스됩니다.최종 선언 필요

yoursource 2022. 9. 4. 23:30
반응형

변수는 내부 클래스 내에서 액세스됩니다.최종 선언 필요

내 안에 컴파일 오류가 있습니다.onClick.

여기 암호가 있습니다.

public class fieldsActivity extends Activity {

Button addSiteButton;
Button cancelButton;
Button signInButton;


/**
 * Called when the activity is first created.
 */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // to create a custom title bar for activity window
    requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);

    setContentView(R.layout.fields);
    // use custom layout title bar
    getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.topbar);

    Pager adapter = new Pager();
    ViewPager mPager = (ViewPager) findViewById(R.id.fieldspager);
    mPager.setAdapter(adapter);
    mPager.setCurrentItem(1);



    addSiteButton = (Button) findViewById(R.id.addSiteButton);
    addSiteButton.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
           mPager.setCurrentItem(2, true); //Compilation error happens here.
        }


    });


    cancelButton = (Button) findViewById(R.id.cancel_button);
    signInButton = (Button) findViewById(R.id.sign_in_button);

}

최종값이 아닌 경우 언제든지 글로벌 변수로 설정할 수 있습니다.

변수를 최종으로 선언하거나 인스턴스(또는 글로벌) 변수로 만들 수 있습니다.최종 선언을 하면 나중에 변경할 수 없습니다.

메서드에서 정의되고 익명 내부 클래스에서 액세스하는 변수는 최종 변수여야 합니다.그렇지 않으면 내부 클래스에서 해당 변수를 사용할 수 있습니다.이 변수가 내부 클래스에서 변경되어 나중에 외부 범위에서 사용되는 경우 내부 클래스의 변경 내용이 외부 범위 내에서 유지되지 않습니다.기본적으로 내적 계층에서 일어나는 일은 내적 계층에 머무릅니다.

나는 여기에 좀 더 자세한 설명을 썼다.또한 인스턴스 및 전역 변수를 최종으로 선언할 필요가 없는 이유도 설명합니다.

에러가 모든 것을 나타내고 있습니다.변경:

ViewPager mPager = (ViewPager) findViewById(R.id.fieldspager);

로.

final ViewPager mPager = (ViewPager) findViewById(R.id.fieldspager);

여기 재미있는 답이 있어요.

최종 요소 배열을 선언하고 배열 요소를 원하는 대로 변경할 수 있습니다.애초에 이 컴파일러 규칙이 구현된 이유를 깨는 것은 확실합니다만, 오늘처럼 타임바인드 상태에 있을 때는 편리합니다.

사실 이건 공적을 주장할 수 없어요.인텔리J의 추천이었습니다!좀 얄미운 느낌이 드네요.그러나 글로벌 변수만큼 나쁘지 않아 보여서 여기서 언급할 가치가 있다고 생각했다.그것은 그 문제에 대한 하나의 해결책일 뿐이다.꼭 최선의 것은 아니다.

final int[] tapCount = {0};

addSiteButton.setOnClickListener(new View.OnClickListener() {

    @Override
    public void onClick(View v) {
       tapCount[0]++;
    }

});

@Veger님 말씀대로 할 수 있습니다.final변수를 내부 클래스에서 사용할 수 있도록 합니다.

final ViewPager pager = (ViewPager) findViewById(R.id.fieldspager);

내가 불렀어pager보다는mPager로컬 변수로 사용하고 있기 때문에onCreate방법.m접두사는 클래스 멤버 변수(즉, 클래스 시작 시에 선언되고 모든 클래스 메서드에서 사용할 수 있는 변수)에 대해 일반적으로 예약됩니다.

클래스 멤버 변수가 실제로 필요한 경우 사용할 수 없기 때문에 최종적으로는 사용할 수 없습니다.findViewById까지 그 가치를 설정하다onCreate해결책은 익명의 내부 클래스를 사용하지 않는 것입니다.이쪽에서mPager변수는 final로 선언할 필요가 없으며 클래스 전체에서 사용할 수 있습니다.

public class MainActivity extends AppCompatActivity {

    private ViewPager mPager;
    private Button mButton;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        // ...

        mPager = (ViewPager) findViewById(R.id.fieldspager);

        // ...

        mButton.setOnClickListener(myButtonClickHandler);
    }


    View.OnClickListener myButtonClickHandler = new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            mPager.setCurrentItem(2, true);
        }
    };
}
    public class ConfigureActivity extends Activity {

        EditText etOne;
        EditText etTwo;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_configure);

            Button btnConfigure = findViewById(R.id.btnConfigure1);   
            btnConfigure.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            configure();
                        }
                    });
    }

    public  void configure(){
            String one = etOne.getText().toString();
            String two = etTwo.getText().toString();
    }
}

언급URL : https://stackoverflow.com/questions/14425826/variable-is-accessed-within-inner-class-needs-to-be-declared-final

반응형