Edit: Lors de la réinitialisation de l'émulateur, le code fonctionne correctement et le titre se met à jour instantanément lorsqu'un élément de spinner est sélectionné. Cependant, le titre n'est toujours pas affiché en entier
Edit 2: Lors de la réinitialisation de l'émulateur, je rencontre à nouveau les mêmes problèmes ...
J'ai essayé d'implémenter un spinner dans mon menu pour mon recordExerciseActivity
.
Chaque fois qu'un élément à l'intérieur de la double flèche est sélectionné, il est défini comme nouveau titre de menu.
Le problème que je rencontre est que la première fois que j'ouvre l'activité et que je clique sur un élément spinner, le titre n'est pas mis à jour. (Le code onItemSelected
ne s'exécute pas)
Cependant, la deuxième fois, cela fonctionne parfaitement bien.
De plus, dans les activités dont les noms d'exercice sont très longs, il n'affiche que les premières lettres.
Parfois, seule la première lettre ...
Comment puis-je m'assurer que le spinner met à jour correctement le titre de mon menu à chaque fois? (affichant également le titre complet).
Menu XML
<menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto">
<item
Android:id="@+id/spinner"
Android:background="#ffffff"
app:actionViewClass="Android.widget.Spinner"
app:showAsAction="always"
Android:title="spinner Title" />
</menu>
RecordExerciseActivity
public class RecordExerciseActivity2 extends AppCompatActivity {
List<String> allChildExerciseNames = new ArrayList<>();
public static final String PARENT_EXERCISE_ID = "-999";
public static final String EXTRA_DATE = "com.example.exerciseappv4.EXTRA_DATE";
public static final String EXTRA_WEEK_DATES = "1";
public static String EXTRA_JUNCTIONID = "EXERCISE_JUNCTION_ID";
int parentExerciseID;
private ChildExerciseViewModel childExerciseViewModel;
String firstExerciseName;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_record_exercise);
Intent intent = getIntent();
if (intent.hasExtra(PARENT_EXERCISE_ID)) {
parentExerciseID = Integer.parseInt(intent.getStringExtra(PARENT_EXERCISE_ID));
}
BottomNavigationView bottomNav = findViewById(R.id.top_navigation);
bottomNav.setOnNavigationItemSelectedListener(navListener);
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container2, new RecordExerciseFragment()).commit();
getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_back);
childExerciseViewModel = ViewModelProviders.of(this).get(ChildExerciseViewModel.class);
childExerciseViewModel.getChildExerciseNameFromParentID(parentExerciseID).observe(this, this::setChildExerciseName);
childExerciseViewModel.getAllchildExercisesFromParentID(parentExerciseID).observe(this, this::getAllChildExercisesFromParentID);
}
private BottomNavigationView.OnNavigationItemSelectedListener navListener =
new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
Fragment selectedFragment = null;
switch (item.getItemId()) {
case R.id.nav_track:
selectedFragment = new RecordExerciseFragment();
break;
case R.id.nav_history:
selectedFragment = new RecordExerciseHistoryFragment();
break;
case R.id.nav_exercise_list:
selectedFragment = new ExerciseGraphFragment();
break;
}
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container2, selectedFragment).commit();
return true;
}
};
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater menuInflater = getMenuInflater();
menuInflater.inflate(R.menu.record_exercise_menu, menu);
MenuItem item = menu.findItem(R.id.spinner);
Spinner spinner = (Spinner) item.getActionView();
ArrayList<String> spinnerStringArray = new ArrayList<>();
//Add your data to your array
spinnerStringArray.addAll(allChildExerciseNames);
ArrayAdapter<String> spinnerAdapter = new ArrayAdapter<String>(this,
Android.R.layout.simple_dropdown_item_1line, allChildExerciseNames);
spinner.setAdapter(spinnerAdapter);
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
Log.i("Spinner Item Selected", "TRUE");
String selectedExercise = parent.getItemAtPosition(position).toString();
setTitle(selectedExercise);
}
public void onNothingSelected(AdapterView<?> parent) {
}
});
return true;
}
private void setChildExerciseName(String childExerciseName) {
firstExerciseName = childExerciseName;
setTitle(firstExerciseName);
}
private void getAllChildExercisesFromParentID(List<String> allChildExercisesReceived) {
allChildExerciseNames.addAll(allChildExercisesReceived);
}
}
Fondamentalement, à moins que vous ne disiez explicitement à Android studio d'appeler onCreateOptionsMenu au onCreate de l'activité, il ne le fait pas tant que les boutons de menu ne sont pas réellement interagis avec. Donc, ce qui se passe ici, c'est que lorsque vous sont en train de le sélectionner pour la première fois. Menu est créé mais onClick n'est pas enregistré.
Il suffit d'ajouter un appel à la onCreateOptionsMenu(menu)
à la fin de la fonction onCreate de l'activité qui devrait le corriger.