Trong các ứng dụng của tôi, tôi thường bật/tắt các mục menu và hiển thị chúng từ onPrepareOptionsMenu.Làm cách nào tôi có thể làm mới ActionBar khi onPrepareOptionsMenu chuyển các mục menu?
Hôm nay tôi bắt đầu thêm thuộc tính menu android: showAsAction vào một số ứng dụng Android 2.x của tôi để hiển thị các mục trình đơn được sử dụng nhiều nhất trên ActionBar.
Thanh tác vụ không phản ánh bật/tắt và hiển thị ngay lập tức. Tôi cần nhấp vào menu thả xuống ở bên phải để xem thay đổi này xảy ra.
Ok, tôi hiểu rằng trình đơn kích hoạt onPrepareOptionsMenu. Nhưng tôi cần phải làm gì để làm mới ActionBar? Tôi nghĩ rằng thay đổi này cần phải được áp dụng từ bên trong onOptionsItemSelected nhưng tôi không biết những gì tôi nên gọi.
Dưới đây là menu:
<item
android:icon="@drawable/ic_menu_mapmode"
android:id="@+id/men_mapview"
android:showAsAction="ifRoom|withText"
android:title="@string/txt_mapview" />
<item
android:icon="@drawable/ic_menu_mapmode"
android:id="@+id/men_satelliteview"
android:showAsAction="ifRoom|withText"
android:title="@string/txt_satelliteview" />
Đây là onPrepareOptionsMenu:
@Override
public boolean onPrepareOptionsMenu(final Menu menu) {
MenuItem menuItemMapView = menu.findItem(R.id.men_mapview);
MenuItem menuItemSatelliteView = menu.findItem(R.id.men_satelliteview);
if (mapView.isSatellite()) {
menuItemMapView.setEnabled(true).setVisible(true);
menuItemmenuItemSatelliteView.setEnabled(false).setVisible(false);
} else {
menuItemMapView.setEnabled(false).setVisible(false);
menuItemmenuItemSatelliteView.setEnabled(true).setVisible(true);
}
return super.onPrepareOptionsMenu(menu);
}
Đây là onOptionsItemSelected
@Override
public boolean onOptionsItemSelected(final MenuItem menuItem) {
switch (menuItem.getItemId()) {
case R.id.men_mapview:
mapView.setSatellite(false);
mapView.setStreetView(true);
mapView.invalidate();
invalidateOptionsMenu(); // This works on Android 3.x devices only
return true;
case R.id.men_satelliteview:
mapView.setSatellite(true);
mapView.setStreetView(false);
mapView.invalidate();
invalidateOptionsMenu(); // This works on Android 3.x devices only
return true;
}
return super.onOptionsItemSelected(menuItem);
}
EDIT: Nếu tôi thêm invalidateOptionsMenu này hoạt động trên Android 3. x ứng dụng nhưng gặp sự cố Thiết bị Android 2.x do phương pháp bị thiếu. Cách được khuyến nghị để làm điều đó là đúng?
các differnece giữa câu trả lời của bạn là gì và chỉ cần đặt phiên bản chec k xung quanh cuộc gọi ban đầu của anh ta nếu (Build.VERSION.SDK_INT> = 11) {invalidateOptionsMenu(); }? bạn có thể kiểm tra phiên bản trong cuộc gọi phương thức versionHelper không? – topwik
@towpse Lý do anh ta có lớp trợ giúp có cấu trúc vì nó là để tránh một vụ tai nạn do khả năng tương thích không ngược. Phương thức 'invalidateOptionsMenu()' chỉ tồn tại trong API 11 (tổ ong) và lên. Vì vậy, nếu ứng dụng của bạn chạy trên bất kỳ thứ gì thấp hơn API 11 thì ứng dụng đó sẽ gặp sự cố. Để tránh điều này, bạn quấn phương thức được đề cập đến trong một phương thức ** static ** khác (ví dụ 'refreshActionBarMenu()') và ** only ** gọi phương thức tĩnh này nếu bạn đang chạy trên API> 11 (do đó kiểm tra phiên bản _before_) bạn gọi phương thức tĩnh).Điều này làm việc vì lớp 'VersionHelper' không được nạp cho đến khi bạn thực sự sử dụng nó. –
@Turbo ok tuyệt vời, cảm ơn vì lời giải thích, vậy bạn sẽ làm gì trong trường hợp khác? không cập nhật trình đơn ở tất cả hoặc cách cũ hơn để thực hiện cập nhật mục menu nếu người dùng đang chạy hệ điều hành cũ hơn là gì? – topwik