【发布时间】:2020-07-25 16:40:38
【问题描述】:
我想使用 Firebase 远程配置隐藏和取消隐藏 MenuItem ((R.id.bored))。但它显示 NullPointerException。请帮忙!有没有其他方法可以远程隐藏和取消隐藏该菜单项(R.id.bored)?
这里是 HomeActivity.java
public class HomeActivity
extends Activity
implements NavigationView.OnNavigationItemSelectedListener, PowerfulActionModeSupport {
public static final int REQUEST_PERMISSION_ALL = 1;
private NavigationView mNavigationView;
private DrawerLayout mDrawerLayout;
private PowerfulActionMode mActionMode;
private HomeFragment mHomeFragment;
private MenuItem mTrustZoneToggle;
private IntentFilter mFilter = new IntentFilter();
private BroadcastReceiver mReceiver = null;
private long mExitPressTime;
private int mChosenMenuItemId;
private RewardedVideoAd mRewardedVideoAd;
private InterstitialAd mInterstitialAd;
private FirebaseRemoteConfig mFirebaseRemoteConfig;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mFirebaseRemoteConfig = FirebaseRemoteConfig.getInstance();
FirebaseRemoteConfigSettings configSettings = new FirebaseRemoteConfigSettings.Builder()
.setMinimumFetchIntervalInSeconds(3600)
.build();
mFirebaseRemoteConfig.setConfigSettingsAsync(configSettings);
mFirebaseRemoteConfig.setDefaultsAsync(R.xml.remote);
final Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
mHomeFragment = (HomeFragment) getSupportFragmentManager().findFragmentById(R.id.activitiy_home_fragment);
mActionMode = findViewById(R.id.content_powerful_action_mode);
mNavigationView = findViewById(R.id.nav_view);
mDrawerLayout = findViewById(R.id.drawer_layout);
mTrustZoneToggle = mNavigationView.getMenu().findItem(R.id.menu_activity_trustzone);
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this, mDrawerLayout, toolbar, R.string.text_navigationDrawerOpen, R.string.text_navigationDrawerClose);
mDrawerLayout.addDrawerListener(toggle);
toggle.syncState();
mFilter.addAction(CommunicationService.ACTION_TRUSTZONE_STATUS);
mDrawerLayout.addDrawerListener(new DrawerLayout.SimpleDrawerListener() {
@Override
public void onDrawerClosed(View drawerView) {
applyAwaitingDrawerAction();
}
});
mNavigationView.setNavigationItemSelectedListener(this);
mActionMode.setOnSelectionTaskListener(new PowerfulActionMode.OnSelectionTaskListener() {
@Override
public void onSelectionTask(boolean started, PowerfulActionMode actionMode) {
toolbar.setVisibility(!started ? View.VISIBLE : View.GONE);
}
});
mFirebaseRemoteConfig.fetchAndActivate()
.addOnCompleteListener(this, new OnCompleteListener<Boolean>() {
@Override
public void onComplete(@NonNull Task<Boolean> task) {
if (task.isSuccessful()) {
mFirebaseRemoteConfig.activate();
boolean updated = task.getResult();
View headerView = mNavigationView.getHeaderView(0);
MenuItem boredItem = mNavigationView.getMenu().findItem(R.id.bored);
Configuration configuration = getApplication().getResources().getConfiguration();
boredItem.setVisible(mFirebaseRemoteConfig.getBoolean("remote_bored"));
Toast.makeText(HomeActivity.this, "Fetch and activate succeeded",
Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(HomeActivity.this, "Fetch failed",
Toast.LENGTH_SHORT).show();
}
}
});
}
这里是 remote.xml
<?xml version="1.0" encoding="utf-8"?>
<!-- START xml_defaults -->
<defaultsMap>
<entry>
<key>remote_bored</key>
<value>false</value>
</entry>
</defaultsMap>
<!-- END xml_defaults -->
这里是drawer_main.xml
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<item
android:id="@+id/bored_button"
android:orderInCategory="19"
android:title="@string/bored"
android:icon="@drawable/ic_bored"
android:actionLayout="@layout/layout_main_navigationview_footer"/>
</group>
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.drawerlayout.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:openDrawer="start">
<include
layout="@layout/toolbar_main"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<com.google.android.material.navigation.NavigationView
android:id="@+id/nav_view"
style="?navigationViewStyle"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
app:headerLayout="@layout/header_default_device"
app:menu="@menu/drawer_main" />
</androidx.drawerlayout.widget.DrawerLayout>
Logcat:
2020-07-25 21:47:07.228 20224-20224/go.dodo.GETit E/AndroidRuntime: FATAL EXCEPTION: main
Process: go.dodo.GETit, PID: 20224
java.lang.NullPointerException: Attempt to invoke interface method 'android.view.MenuItem android.view.MenuItem.setVisible(boolean)' on a null object reference
at go.dodo.GETit.activity.HomeActivity$3.onComplete(HomeActivity.java:203)
at com.google.android.gms.tasks.zzi.run(com.google.android.gms:play-services-tasks@@17.0.2:4)
at android.os.Handler.handleCallback(Handler.java:883)
at android.os.Handler.dispatchMessage(Handler.java:100)
at com.google.android.gms.internal.tasks.zzb.dispatchMessage(com.google.android.gms:play-services-tasks@@17.0.2:6)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7356)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
【问题讨论】:
标签: android firebase menu navigation-drawer firebase-remote-config