변수는 내부 클래스 내에서 액세스됩니다.최종 선언 필요
내 안에 컴파일 오류가 있습니다.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
'programing' 카테고리의 다른 글
jQuery: 선택한 요소 태그 이름을 가져옵니다. (0) | 2022.09.04 |
---|---|
정의되지 않은 함수 curl_init()를 호출합니다. (0) | 2022.09.04 |
도커의 MySql 데이터베이스 쿼리 (0) | 2022.09.04 |
nuxt를 사용하여 로컬 JS 파일을 로드하는 방법 (0) | 2022.09.04 |
Custom Nova Tool에서 Laravel Nova 구성 요소를 사용하는 방법 (0) | 2022.09.04 |