2017-11-01 17 views
0

メニュー項目のvisibility属性をonReceiveandroid Broadcast classの方法が、私はそれが同じ方法で使用して別のintentのために働く場合でも、上記title errorを得続ける:java.lang.NullPointerException:ヌルオブジェクトリファレンスでインターフェイスメソッド 'android.view.MenuItem android.view.Menu.findItem(int)'を呼び出そうとしました

マイBroadcast classコード:

/** 
    * Use this to catch the intent sent from the JobSchedulerService class 
    */ 
    public BroadcastReceiver broadcastReceiver = new BroadcastReceiver() { 

     @Override 
     public IBinder peekService(Context myContext, Intent service) { 
      return super.peekService(myContext, service); 
     } 

     @Override 
     public void onReceive(Context context, Intent intent) { 

      //TODO: Remove 
      Toast.makeText(context, "Intent detected", Toast.LENGTH_SHORT).show(); 

      if (intent.getAction().equals(MY_INTENT)) { 

       //TODO: Remove 
       Toast.makeText(context, "MY_INTENT", Toast.LENGTH_SHORT).show(); 

       MenuItem refreshMenuItem = menu.findItem(R.id.menu_refresh); 
       refreshMenuItem.setVisible(true); 
       getLoaderManager().restartLoader(CRYPTOCURRENCY_LOADER_ID, null, HomeActivity.this); 
      }  


      if (intent.getAction().equals(CONNECTION_INTENT)) { 

       status = NetworkUtil.getConnectivityStatusString(context); 

       //TODO: Remove 
       Toast.makeText(context, "CONNECT_INTENT", Toast.LENGTH_SHORT).show(); 

       MenuItem netMenuItem = menu.findItem(R.id.menu_network_available); 
       MenuItem nonetMenuItem = menu.findItem(R.id.menu_network_absent); 


       // Check and notify user of network status 
       if (Objects.equals(status, "Wifi enabled") || Objects.equals(status, "Mobile data enabled")) { 

        netMenuItem.setVisible(true); 
        nonetMenuItem.setVisible(false); 

       } else { 

        netMenuItem.setVisible(false); 
        nonetMenuItem.setVisible(true); 

       } 

      } 
     } 
    }; 

NetworkUtil.getConnectivityStatusString(context)コード:

public class NetworkUtil { 

    public static int TYPE_WIFI = 1; 
    public static int TYPE_MOBILE = 2; 
    public static int TYPE_NOT_CONNECTED = 0; 


    public static int getConnectivityStatus(Context context) { 
     ConnectivityManager cm = (ConnectivityManager) context 
       .getSystemService(Context.CONNECTIVITY_SERVICE); 

     NetworkInfo activeNetwork = cm.getActiveNetworkInfo(); 
     if (null != activeNetwork) { 
      if (activeNetwork.getType() == ConnectivityManager.TYPE_WIFI) 
       return TYPE_WIFI; 

      if (activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE) 
       return TYPE_MOBILE; 
     } 
     return TYPE_NOT_CONNECTED; 
    } 

    public static String getConnectivityStatusString(Context context) { 
     int conn = NetworkUtil.getConnectivityStatus(context); 
     String status = null; 
     if (conn == NetworkUtil.TYPE_WIFI) { 
      status = "Wifi enabled"; 
     } else if (conn == NetworkUtil.TYPE_MOBILE) { 
      status = "Mobile data enabled"; 
     } else if (conn == NetworkUtil.TYPE_NOT_CONNECTED) { 
      status = "Not connected to Internet"; 
     } 
     return status; 
    } 
} 

onCreateMenuOption方法:

@Override 
    public boolean onCreateOptionsMenu(final Menu menu) { 

     //inflate the menu options from the menu xml file 
     //This add menu items to the app bar 
     getMenuInflater().inflate(R.menu.network_available, menu); 
     this.menu = menu; 

     if (menu != null) { 

      if (isConnected()) { 
       // Let user know the status of the device network 
       menu.findItem(R.id.menu_network_available).setVisible(true); 
       menu.findItem(R.id.menu_network_absent).setVisible(false); 
      } else { 
       // Let user know the status of the device network 
       menu.findItem(R.id.menu_network_available).setVisible(false); 
       menu.findItem(R.id.menu_network_absent).setVisible(true); 
      } 


     } 


     return true; 
    } 

menu 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/menu_refresh" 
     android:icon="@drawable/progress" 
     android:title="data Refresh" 
     android:visible="false" 
     app:showAsAction="always" /> 

    <item 
     android:id="@+id/menu_network_available" 
     android:title="@string/network_avalable" 
     android:visible="false" 
     app:showAsAction="always" /> 


    <item 
     android:id="@+id/menu_network_absent" 
     android:title="@string/network_absent" 
     android:visible="true" 
     app:showAsAction="ifRoom" /> 


</menu> 

答えて

1

私はそれがなく、他に一つの場所であなたのために働いている理由を詳しくわからないんだけど、私ができますあなたがやっていることはベストプラクティスに従わないと言います。

ブロードキャストから直接Menuを変更するのではなく、supportInvalidateOptionsMenu()に電話するほうがよいでしょう。また、あなたのアクティビティでonPrepareOptionsMenu(Menu)を上書きし、そこで変更を実行します。たぶん、このような何か:

// in the broadcast receiver 
public void onReceive(Context context, Intent intent) { 
    ... 
    status = NetworkUtil.getConnectivityStatusString(context); 
    online = (Objects.equals(status, "Wifi enabled") || Objects.equals(status, "Mobile data enabled")); 
    supportInvalidateOptionsMenu(); 
    ... 
} 


// in the activity 
public boolean onPrepareOptionsMenu(Menu menu) { 
    MenuItem netMenuItem = menu.findItem(R.id.menu_network_available); 
    MenuItem nonetMenuItem = menu.findItem(R.id.menu_network_absent); 

    netMenuItem.setVisible(online); 
    nonetMenuItem.setVisible(!online); 

    return true; 
} 
+0

私はので、私はそれを実装してみましょうし、それは素晴らしいが素敵演じ –

+0

を果たしているかを確認 '最高practice'の使用の私の欠如を許し、答えてくれてありがとう下さいアンドロイドを学んでいます –

関連する問題

 関連する問題