编辑:重新设置模拟器后,代码工作正常,当选择微调器项目时,标题会立即更新。但是,标题仍然没有完整显示。
编辑2:重新设置模拟器后,我又遇到了同样的问题......。
我试着在我的菜单中实现一个旋转器,用于我的 recordExerciseActivity
.
每次选择微调器内的一个项目时,这个项目都会被设置为新的菜单标题。
我遇到的问题是,当我第一次打开活动并点击一个微调器项目时,标题没有更新。(这个 onItemSelected
代码不运行)
但是,第二次就完全正常了。
此外,在练习名称很长的活动中,它只显示前几个字母。
有时只显示第一个字母...
我怎样才能确保微调器每次都能正确地更新我的菜单标题? (同时显示完整的标题)。
菜单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>
记录练习活动
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);
}
}
试着用这个自定义 layout
为你 Spinner
:simple_spinner_item_custom.xml
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/custom_text_1"
style="?android:attr/spinnerItemStyle"
android:singleLine="false"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ellipsize="none"
android:textAlignment="inherit" />
这是对原来的简单修改 simple_spinner_item.xml
文件,使其在你的场景中工作,编辑属性如 android:singleLine="true"
和 android:ellipsize="marquee"
现在,将这个布局作为参数传给 ArrayAdapter
构造函数为:
ArrayAdapter<String> spinnerAdapter = new ArrayAdapter<>(this,
R.layout.simple_spinner_item_custom, spinnerStringArray);
请注意。没有必要将 Activity
使用 setTitle()
方法。感谢新的 LiveLayoutInspector
在Android Studio 4.0中的功能,我发现这个 Spinner
(其父体也是如此,即 ActionMenuView
)将被拉伸,以适应其内部的内容,并且 title
的 Activity
会被夹在其中。我试图减少 width
的 Spinner
或 ActionMenuView
却没有成功。遗憾的是,这样一来,我想你的返回导航按钮也会被隐藏起来。
但同样,如果你使用 app:showAsAction="ifRoom|collapseActionView"
的属性。Spinner
菜单,你会得到或多或少的类似的UI,玩这些属性,直到它们适合你的需求。
另一个 替代 我此刻能想到的就是 inflate
寻常 menu
以下箭头 icon
那么,在 onOptionsItemSelected
,处理它打开一个 Popup
菜单,将显示当前您的项目列表。Spinner
正在显示。然后,处理 onClick
的 Popup
再次更改标题的 Toolbar
(因为 title
的 Activity
不支持多行,也没有任何的 id
因此,它的对象无法被创建)。)
基本上,除非你明确告诉android studio在Activity的onCreate时调用onCreateOptionsMenu,否则它不会这样做,直到菜单按钮被实际交互。所以这里发生的情况是,当你第一次选择它时,Menu被创建,但onClick没有被注册。
只需添加一个调用到 onCreateOptionsMenu(menu)
在Activity的onCreate函数的结尾处,应该可以解决这个问题。