gpt4 book ai didi

java - 如何确保我的微调器(菜单内)更新我的菜单标题并确保标题完整显示?

转载 作者:行者123 更新时间:2023-12-01 09:07:45 24 4
gpt4 key购买 nike

编辑:重新设置模拟器后,代码工作正常,并且在选择微调器项目时标题会立即更新。但是,标题仍然没有完整显示

编辑2:再次重新设置模拟器后,我又遇到了同样的问题...

我试图在我的菜单中为我的 recordExerciseActivity 实现一个微调器。 .

recordExerciseActivity

每次选择微调器内的项目时,都会将其设置为新的菜单标题。

我遇到的问题是我第一次打开 Activity 并单击微调器项目时,标题没有更新。 (onItemSelected 代码不运行)

但是,第二次它工作得很好。

此外,在练习名称很长的 Activity 中,它只显示前几个字母。

2

有时只有第一个字母...

3

如何确保微调器每次都正确更新我的菜单标题?
(也显示完整的标题)。

菜单 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);
}
}

最佳答案

试试这个自定义 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 也会被拉伸(stretch)以适应其中的内容和 titleActivity将被夹在中间。我试图减少 widthSpinnerActionMenuView没有成功。可悲的是,这样一来,我认为您的后退导航按钮也将被隐藏。 Sandwiched title of the Activity Window
Stretched Spinner

但同样,如果您使用 app:showAsAction="ifRoom|collapseActionView" Spinner 的属性菜单,您将获得或多或少类似的 UI。
使用这些属性,直到它们适合您的需要。

另一个 替代 此刻我能想到的是 inflate一个正常的 menu向下箭头为 icon ,然后在 onOptionsItemSelected , 处理它打开一个 Popup菜单将显示当前您的 Spinner 的项目列表正在显示。然后,处理 onClickPopup再次更改 Toolbar的标题(因为 titleActivity 不支持多行并且它没有任何 id ,因此无法创建其对象)。

关于java - 如何确保我的微调器(菜单内)更新我的菜单标题并确保标题完整显示?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62002792/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com