【问题标题】:MenuItem throwing NullPointerException when using Firebase Remote ConfigMenuItem 在使用 Firebase 远程配置时抛出 NullPointerException
【发布时间】: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


    【解决方案1】:

    此代码返回 null:

    MenuItem boredItem = mNavigationView.getMenu().findItem(R.id.bored);
    

    这意味着您的膨胀菜单 XML 没有名为“无聊”的项目。也许你的意思是bored_button

    【讨论】:

    • 如何隐藏菜单组?
    • 如果您有新问题,请单独发布。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-03
    • 2021-10-29
    • 1970-01-01
    • 2020-06-08
    • 1970-01-01
    相关资源
    最近更新 更多