Je suis bloqué au début même ce ce cours, avant le premier quizz, à l’exécution de l'appli de présentation. Celle-ci plante au démarrage. Tout fonctionne si je ne mets que l'interface, mais dès que j'introduis
PlayButton.setEnabled(false);
dans onCreate, ça ne va plus, l'application démarre mais se ferme aussitôt:
package com.example.philippe.topquiz;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
private TextView mGreetingText;
private EditText mNameInput;
private Button mPlayButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mGreetingText = (TextView)findViewById(R.id.activity_main_greeting_txt);
mNameInput = (EditText)findViewById(R.id.activity_main_name_input) ;
mPlayButton = (Button)findViewById(R.id.activity_main_play_btn) ;
mPlayButton.setEnabled(false); // ça fait planter l'appli
/* ça aussi:
mNameInput.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
}
});
*/
setContentView(R.layout.activity_main);
}
}
et le log cat:
12-14 10:32:39.654 2230-3226/com.google.android.gms I/FA-SVC: App measurement is starting up, version: 11580 12-14 10:32:39.681 2230-3318/com.google.android.gms I/FA-SVC: This instance being marked as an uploader 12-14 10:32:43.016 2230-2240/com.google.android.gms W/SQLiteConnectionPool: A SQLiteConnection object for database '/data/user/0/com.google.android.gms/databases/networkstatistics.sqlite' was leaked! Please fix your application to end transactions in progress properly and to close the database when it is no longer needed.
Je ne comprend d'ailleurs pas ce que SQLite vient faire là dedans.
Merci d'avance des réponses
- Edité par PhilippeLaffez 14 décembre 2017 à 16:52:28
La référence du bouton que tu récupères est nulle car tu donnes le layout APRES la récupération de la référence. L'appel à la méthode setContientView doit être avant les appels à la méthode findViewById.
J'ai une autre question, concernant cette fois-ci le chapitre concernant la récupération du score.
Il faut ajouter le code suivant:
Intent intent = new Intent();
intent.putExtra(BUNDLE_EXTRA_SCORE, mScore);
setResult(RESULT_OK, intent);
finish();
quelque part dans la GameActivity.
Mais ou? Ala fin de OnCreate ? Ailleurs ?
Merci d'éclairer ma lanterne.
D'autre part, est-ce normal qu'Android studio soit si lent ? J'ai un systeme 64 bits avec 8GB de mémoire et pres de 100 GB de DD dispo. ¨Pour démarrer mon appli il faut plusieurs minutes. (quelque secondes pour démarrer une appli java, encore moins pour une appli delphi)
Dans string.xml il y a comme son nom l'indique des chaines de caractères, notamment le nom de l'application (il suffit de l'ouvrir)
Pour les empreintes, je ne sais pas.
J'ai une autre question concernant le cours:
J'ai maintenant progressé dans le cours, mais il y a toujours des choses que je ne comprend pas.
Maintenant l'application stoppe aussitôt après lancement, sans que j'en comprenne la raison. Sans doute du code mal placé ? J'avoue que pour moi ce cours n'est pas très clair.
package vue;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import com.example.philippe.topquiz.R;
import java.util.Arrays;
import model.Question;
import model.QuestionBank;
public class GameActivity extends AppCompatActivity implements View.OnClickListener{
private TextView mQuestionText;
private Button mAnswerButton1;
private Button mAnswerButton2;
private Button mAnswerButton3;
private Button mAnswerButton4;
private QuestionBank mQuestion;
private Question mCurrentQuestion;
private int mNumberOfQuestions;
private int mScore;
public static final String BUNDLE_EXTRA_SCORE = "BUNDLE_EXTRA_SCORE";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mNumberOfQuestions = 4;
mScore = 0;
setContentView(R.layout.activity_game);
mQuestion = this.createQuestionBank();
mQuestionText = (TextView)findViewById(R.id.activity_game_question_text);
mAnswerButton1 = (Button)findViewById(R.id.activity_game_answer1_btn);
mAnswerButton2 = (Button)findViewById(R.id.activity_game_answer2_btn);
mAnswerButton3 = (Button)findViewById(R.id.activity_game_answer3_btn);
mAnswerButton1 = (Button)findViewById(R.id.activity_game_answer4_btn);
// Use the same listener for the four buttons.
// The tag value will be used to distinguish the button triggered
mAnswerButton1.setOnClickListener(this);
mAnswerButton2.setOnClickListener(this);
mAnswerButton3.setOnClickListener(this);
mAnswerButton4.setOnClickListener(this);
// Use the tag property to 'name' the buttons
mAnswerButton1.setTag(0);
mAnswerButton2.setTag(1);
mAnswerButton3.setTag(2);
mAnswerButton4.setTag(3);
}
QuestionBank createQuestionBank(){
// mériterit d'être déplacé dans une classe spécifique
Question question1 = new Question("En quelle année a eu lieu la bataille d'Austerliz ?",
Arrays.asList("1803",
"1804",
"1805",
"1806"
),
2);
Question question2 = new Question("En quelle année a eu lieu la bataille de Tolbiac ?",
Arrays.asList("495",
"496",
"497",
"498"
),
1);
Question question3 = new Question("En quelle année a eu lieu la bataille de Cannes ?",
Arrays.asList("216 avant JC",
"180 avant JC",
"180",
"216"
),
0);
Question question4 = new Question("En quelle année eu lieu la bataille de Pavie, défaire de François Ier?",
Arrays.asList("1515",
"1525",
"1530",
"1535"
),
1);
Question question5 = new Question("En quelle année a eu lieu le siège de Paris par Attila ?",
Arrays.asList("330",
"412",
"451",
"513"
),
2);
return new QuestionBank(Arrays.asList(question1,question2,question3,question4,question5));
}
private void displayQuestion(final Question question) {
this.setgQuestionTextTexte(question.getQuestion());
this.setgAnswerButton1Text(question.getChoiceList().get(0).toString());
this.setgAnswerButton2Text(question.getChoiceList().get(1).toString());
this.setgAnswerButton3Text(question.getChoiceList().get(2).toString());
this.setgAnswerButton4Text(question.getChoiceList().get(3).toString());
}
// Setters et getters
public void setgQuestionTextTexte(String s) {
this.mQuestionText.setText(s);
}
public void setgAnswerButton1Text(String s) {
this.mAnswerButton1.setText(s);
}
public void setgAnswerButton2Text(String s) {
this.mAnswerButton2.setText(s);
}
public void setgAnswerButton3Text(String s) {
this.mAnswerButton3.setText(s);
}
public void setgAnswerButton4Text(String s) {
this.mAnswerButton4.setText(s);
}
@Override
public void onClick(View v) {
int responseIndex = (int) v.getTag();
if (--mNumberOfQuestions == 0) {
// No question left, end the game
/* int scoremax = data.getIntExtra(GameActivity.BUNDLE_EXTRA_SCORE,0);
if (scoremax<mScore){
}*/
Intent intent = new Intent();
intent.putExtra(BUNDLE_EXTRA_SCORE, mScore);
setResult(RESULT_OK, intent);
finish();
} else {
if (responseIndex ==mCurrentQuestion.getAnswerIndex()){
mScore+=1;
}
mCurrentQuestion = mQuestion.getQuestion();
displayQuestion(mCurrentQuestion);
mNumberOfQuestions-=1;
}
}
}
Question:
package model;
import java.util.List;
/**
* Created by Philippe on 15/12/2017.
*/
public class Question {
private String mQuestion;
private List<String> mChoiceList;
private int mAnswerIndex;
public Question(String question, List<String> choiceList, int answerIndex) {
this.setQuestion(question);
this.setChoiceList(choiceList);
this.setAnswerIndex(answerIndex);
}
public String getQuestion() {
return mQuestion;
}
public void setQuestion(String question) {
mQuestion = question;
}
public List<String> getChoiceList() {
return mChoiceList;
}
public void setChoiceList(List<String> choiceList) {
if (choiceList == null) {
throw new IllegalArgumentException("Array cannot be null");
}
mChoiceList = choiceList;
}
public int getAnswerIndex() {
return mAnswerIndex;
}
public void setAnswerIndex(int answerIndex) {
if (answerIndex < 0 || answerIndex >= mChoiceList.size()) {
throw new IllegalArgumentException("Answer index is out of bound");
}
mAnswerIndex = answerIndex;
}
@Override
public String toString() {
return "Question{" +
"mQuestion='" + mQuestion + '\'' +
", mChoiceList=" + mChoiceList +
", mAnswerIndex=" + mAnswerIndex +
'}';
}
}
package model;
import java.util.Collections;
import java.util.List;
/**
* Created by Philippe on 15/12/2017.
*/
public class QuestionBank {
private List<Question> mQuestionList;
private int mNextQuestionIndex;
public QuestionBank(List<Question> questionList) {
mQuestionList = questionList;
// Shuffle the question list
Collections.shuffle(mQuestionList);
mNextQuestionIndex = 0;
}
public Question getQuestion() {
// Ensure we loop over the questions
if (mNextQuestionIndex == mQuestionList.size()) {
mNextQuestionIndex = 0;
}
// Please note the post-incrementation
return mQuestionList.get(mNextQuestionIndex++);
}
}
User
package model;
/**
* Created by Philippe on 15/12/2017.
*/
public class User {
private String mFirstName;
// getters et setters
public void setFirstName(String s)
{this.mFirstName = s;
}
public String getFirstName() {
return this.mFirstName;
}
}
Si ton application plante elle produit dans le logcat une stacktrace. C'est elle qui va te permettre de savoir d'où vient le crash. Posté la ici qu'on la regarde.
J'ai vu le stacktrace puis je l'ai perdu. Android studio est trop b.. que, tro usine à gaz, je retrouve pas.
J'ai trouvé ça dans les event logs:
01/04 17:40:09: Launching app $ adb install-multiple -r -t C:\Users\Philippe\AndroidStudioProjects\TopQuiz\app\build\intermediates\split-apk\debug\slices\slice_4.apk C:\Users\Philippe\AndroidStudioProjects\TopQuiz\app\build\intermediates\split-apk\debug\slices\slice_9.apk C:\Users\Philippe\AndroidStudioProjects\TopQuiz\app\build\intermediates\split-apk\debug\slices\slice_8.apk C:\Users\Philippe\AndroidStudioProjects\TopQuiz\app\build\intermediates\split-apk\debug\slices\slice_2.apk C:\Users\Philippe\AndroidStudioProjects\TopQuiz\app\build\intermediates\split-apk\debug\slices\slice_3.apk C:\Users\Philippe\AndroidStudioProjects\TopQuiz\app\build\intermediates\split-apk\debug\slices\slice_6.apk C:\Users\Philippe\AndroidStudioProjects\TopQuiz\app\build\intermediates\split-apk\debug\slices\slice_5.apk C:\Users\Philippe\AndroidStudioProjects\TopQuiz\app\build\intermediates\split-apk\debug\slices\slice_1.apk C:\Users\Philippe\AndroidStudioProjects\TopQuiz\app\build\intermediates\split-apk\debug\slices\slice_7.apk C:\Users\Philippe\AndroidStudioProjects\TopQuiz\app\build\intermediates\split-apk\debug\slices\slice_0.apk C:\Users\Philippe\AndroidStudioProjects\TopQuiz\app\build\intermediates\split-apk\debug\dep\dependencies.apk C:\Users\Philippe\AndroidStudioProjects\TopQuiz\app\build\outputs\apk\debug\app-debug.apk Split APKs installed $ adb shell am start -n "com.example.philippe.topquiz/vue.MainActivity" -a android.intent.action.MAIN -c android.intent.category.LAUNCHER Client not ready yet..Waiting for process to come online Connected to process 2693 on device emulator-5554 Capturing and displaying logcat messages from application. This behavior can be disabled in the "Logcat output" section of the "Debugger" settings page. I/InstantRun: starting instant run server: is main process D/AndroidRuntime: Shutting down VM E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.philippe.topquiz, PID: 2693
java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.philippe.topquiz/vue.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference
voilà le fautif, mais je ne comprend pas à quoi ça correspond dans le code, ni ne trouve de clé permettant de trouver la ligne fautive, à part le fait qu'il y a un rapport avec des chaines de caratères
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2679) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2856) at android.app.ActivityThread.-wrap11(Unknown Source:0) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1589) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop(Looper.java:164) at android.app.ActivityThread.main(ActivityThread.java:6494) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807) Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference at android.content.ContextWrapper.getPackageName(ContextWrapper.java:135) at android.app.Activity.getLocalClassName(Activity.java:5854) at android.app.Activity.getPreferences(Activity.java:5887) at vue.MainActivity.<init>(MainActivity.java:26) at java.lang.Class.newInstance(Native Method) at android.app.Instrumentation.newActivity(Instrumentation.java:1174) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2669) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2856) at android.app.ActivityThread.-wrap11(Unknown Source:0) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1589) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop(Looper.java:164) at android.app.ActivityThread.main(ActivityThread.java:6494) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
Mais ça met longtemps à télécharger, c'est un vieux tuto pour la version Android 5 (là on est à +8 27) et je ne suis pas sûr du résultat après avoir essayé de nombreuses choses.
Un autre problème avec Linux, lancer studio.sh ne fonctionne plus, ce fichier est même vide.
Bonsoir à vous j'ai un problème avec le TP de la partie 3, du tuto Développez une application pour Android: en réalité j'ai suivi les etapes du tp, même apres avoir configurer le manifest le programme ne fonctionne pas. voici mon code ainsi que l'erreur afficher en console:
ma classe HNArticlesAdapter
public class HNArticlesAdapter extends RecyclerView.Adapter<HNArticlesAdapter.HNArticleViewHolder> implements HNQueryCallback {
private final List<HNArticle> _articles = new ArrayList<HNArticle>();
@Override
public void onArticlesReceived(List<HNArticle> articles, boolean hasMore) {
_articles.addAll(articles);
notifyDataSetChanged();
}
@Override
public int getItemCount() {
return _articles.size();
}
@Override
public HNArticleViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item, parent, false);
return new HNArticleViewHolder(view);
}
@Override
public void onBindViewHolder(HNArticleViewHolder holder, int position) {
holder.bind(_articles.get(position));
}
public static class HNArticleViewHolder extends RecyclerView.ViewHolder {
private final TextView _title;
public HNArticleViewHolder(View view) {
super(view);
_title = (TextView) view.findViewById(R.id.title);
}
public void bind(HNArticle article) {
_title.setText(article.title);
}
}
}
Je parcours actuellement les différents cours android et je bloque un peu sur les layout. Je n'ai pas trouvé le moyen de réaliser un layout vertical qui comprendrait un titre, une listeview et un boutton. Mon problème est que je n'arrive pas à mettre le titre en haut et le boutton tout en bas de mon layout vertical (listview au mileu) :
Je pense que mon problème n'est pas sorcier mais je n'y arrive pas. J'ai l'impression que la listview pose de probleme car elle n'a pas de taille prédéfinis. Peut etre avec une scroll view ?
Il faudrait peux être revoir ton manifest, car c'est dans ce fichier que l'on donne les permission d'une application d'accéder à tel ou tel ressource (bluetooth, sms, email et je ne sais quoi d'autre). revoir le chapitre qui pour sur les maifest d'une application android, je crois que c'est de là que vient ton problème. l'application ne détecte aucun bluetooth dont n'affiche rien.
Bonjour à tous et merci OpenClassrooms pour ce tuto.
J'ai un soucis pour lancer l'émulateur. Un message d'erreur m'indique que "Intel HAXM" est requis et que VT-x n'est pas activé dans le BIOS. Je ne suis vraiment pas fan d'aller bricoler dans le BIOS . J'utilise Bluestacks pour émuler certains jeux Android sur mon PC. Puis-je passer par lui pour tester mes applis créées sur Android Studio ? Et si oui, comment faire ?
c'est ton pc qui ne support pas l'emulateur, soit le processeur soit ta carte graphique, il faudrait mieux exécuter ton code android sur un téléphone physique
Je n'ai pas pu résoudre le problème et ceci m'a bloqué et découragé. J'ai laissé tomber ce cours. Il y a un autre cours Android sur Openclassroom, j'envisage de le suivre, mais n'ai pas le temps en ce moment
Moi c'est Albert j'ai un problème quand je déclare la librairie recyclerview dans les dépendances
voici ce que j'ai ecrit implementation 'com.android.support.recyclerview-v7:26.0.0'
quand j'essaie de synchroniser ça me génère l'erreur ci-dessous
Attribute meta-data#android.support.VERSION@value value=(26.0.0-beta1) from [com.android.support:appcompat-v7:26.0.0-beta1] AndroidManifest.xml:28:13-41 is also present at [com.android.support:recyclerview-v7:26.0.0] AndroidManifest.xml:25:13-35 value=(26.0.0). Suggestion: add 'tools:replace="android:value"' to <meta-data> element at AndroidManifest.xml:26:9-28:44 to override.
finalement je ne comprends plus rien besoin d'aide
ce serait mieux de nous faire une capture d'ecran pour que nous puissons d'aider. pour la capture d'ecran tu peux utuliser le programme "snipe" deja installer sur ton windows.
Regle d'or du developpement Android : Ne jamais stocker le contexte ! (A moins de savoir exactement ce que vous faites, ca cree des fuites memoire).
Creez plutot l'intent avec cette ligne :
Intent intent = new Intent(itemView.getContext(), MyWebView.class);
- Edité par SalomonBrys 29 mars 2016 à 8:34:57
Bonjour. Je n'ai pas stocké le contexte et j'ai bien pensé à déclarer ma 2e activité LectureContenu dans le Manifest. Pourtant, mon code refuse d'être compilé. Voici mon code :
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Mon site - Mon livre sur le XML - Mon blog
Mon site - Mon livre sur le XML - Mon blog
L'Imagination est plus importante que le savoir !!!