Donc, le titre dit tout. J'obtiens une erreur de compilation dans mon fichier onClick
.
Voici le code.
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);
}
Réponses:
Si vous ne voulez pas le rendre définitif, vous pouvez toujours en faire une variable globale.
la source
Vous pouvez déclarer la variable finale ou en faire une variable d'instance (ou globale). Si vous le déclarez définitif, vous ne pourrez pas le modifier plus tard.
Toute variable définie dans une méthode et accédée par une classe interne anonyme doit être définitive. Sinon, vous pouvez utiliser cette variable dans la classe interne, sans savoir que si la variable change dans la classe interne, puis qu'elle est utilisée plus tard dans la portée englobante, les modifications apportées à la classe interne ne sont pas conservées dans la portée englobante. Fondamentalement, ce qui se passe dans la classe interne reste dans la classe interne.
J'ai écrit une explication plus approfondie ici . Il explique également pourquoi les variables d'instance et globales n'ont pas besoin d'être déclarées finales.
la source
L'erreur dit tout, changez:
à
la source
final
, en langage Java. En plus de l'absence de paramètres par référence, cette règle garantit que les sections locales ne sont affectées que dans la méthode à laquelle elles appartiennent. Le code est donc plus lisible.addSiteButton.setOnClickListener(new View.OnClickListener() {
avez-vous une idée de la raison pour laquelle cela se produirait?null
. Probablement, findViewById est de retournull
. Je ne peux pas en dire plus, n'étant pas un programmeur Android; Je vous conseille d'ouvrir une question distincte. Certes, cela n'a rien à voir avec les classes internes, finales, et similaires .Voici une réponse amusante.
Vous pouvez déclarer un tableau final à un élément et changer les éléments du tableau autant que vous voulez apparemment. Je suis sûr que cela brise la raison même pour laquelle cette règle de compilation a été implémentée en premier lieu, mais c'est pratique lorsque vous êtes dans une contrainte temporelle comme je l'étais aujourd'hui.
Je ne peux en fait pas réclamer de crédit pour celui-ci. C'était la recommandation d'IntelliJ! Se sent un peu hacky. Mais cela ne semble pas aussi mauvais qu'une variable globale, alors j'ai pensé que cela valait la peine d'être mentionné ici. Ce n'est qu'une solution au problème. Pas nécessairement le meilleur.
la source
Comme @Veger l'a dit, vous pouvez faire en
final
sorte que la variable puisse être utilisée dans la classe interne.Je l'ai appelé
pager
plutôt quemPager
parce que vous l'utilisez comme variable locale dans laonCreate
méthode. Lem
préfixe est généralement réservé aux variables membres de la classe (c'est-à-dire les variables qui sont déclarées au début de la classe et sont disponibles pour toutes les méthodes de classe).Si vous avez réellement besoin d'une variable de membre de classe, cela ne fonctionne pas pour la rendre finale car vous ne pouvez pas utiliser
findViewById
pour définir sa valeur tant queonCreate
. La solution est de ne pas utiliser de classe interne anonyme. De cette façon, lamPager
variable n'a pas besoin d'être déclarée finale et peut être utilisée dans toute la classe.la source
la source