Jos*_*ett 10 java android android-xml android-menu
编辑:重新设置模拟器后,代码工作正常,选择微调项时标题会立即更新。但是,标题仍未完整显示
编辑 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>
Run Code Online (Sandbox Code Playgroud)
记录练习活动
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);
}
}
Run Code Online (Sandbox Code Playgroud)
尝试使用此自定义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" />
Run Code Online (Sandbox Code Playgroud)
这是对原始文件的简单修改,simple_spinner_item.xml使其在您的场景中工作,并编辑属性,例如android:singleLine="true"和android:ellipsize="marquee",这不会让您显示多行文本。现在,将此布局作为构造函数中的参数传递,ArrayAdapter如下所示:
ArrayAdapter<String> spinnerAdapter = new ArrayAdapter<>(this,
R.layout.simple_spinner_item_custom, spinnerStringArray);
Run Code Online (Sandbox Code Playgroud)
注意:Activity设置使用方法
的标题没有意义setTitle()。感谢LiveLayoutInspectorAndroid Studio 4.0 中的新功能,我发现 this Spinner(它的父级 ie 也会如此ActionMenuView)将被拉伸以适合其中的内容,并且titleofActivity将被夹在中间。我试图减少width或Spinner没有ActionMenuView成功。可悲的是,这样,我认为您的后退导航按钮也将被隐藏。

但同样,如果您app:showAsAction="ifRoom|collapseActionView"对菜单使用属性Spinner,您将获得或多或少类似的 UI。尝试使用这些属性,直到它们满足您的需要。
我现在能想到的另一种选择是使用带有向下箭头的inflate法线作为,然后在 中,处理它以打开一个菜单,该菜单将显示当前正在显示的项目列表。然后,再次处理of来更改 of 的标题(因为of不支持多行,并且它没有任何,所以无法创建它的对象)。menuicononOptionsItemSelectedPopupSpinneronClickPopupToolbartitleActivityid
| 归档时间: |
|
| 查看次数: |
211 次 |
| 最近记录: |