Java 如何在Android中从BroadcastReceiver调用onPrepareOptions菜单()?

Java 如何在Android中从BroadcastReceiver调用onPrepareOptions菜单()?,java,android,Java,Android,我是android的初学者,我在internet.xml中包含了两个图标 ,基于网络连接(例如,如果网络已连接到它 应显示已连接图标,否则应显示未连接图标 在工具栏上),为此,我在中创建了OnPrepareOptions菜单() 活动以及广播接收器来广播当前网络 基于图标必须动态更改的状态 在这里我用意图来广播当前的网络状态,它是 再次启动活动,我不知道怎么打电话 BroadcastReceiver类中的OnPrepareOptions菜单()将 基于网络自动更新工具栏中的菜单项 地位 谁能帮我

我是android的初学者,我在internet.xml中包含了两个图标 ,基于网络连接(例如,如果网络已连接到它 应显示已连接图标,否则应显示未连接图标 在工具栏上),为此,我在中创建了OnPrepareOptions菜单() 活动以及广播接收器来广播当前网络 基于图标必须动态更改的状态

在这里我用意图来广播当前的网络状态,它是 再次启动活动,我不知道怎么打电话 BroadcastReceiver类中的OnPrepareOptions菜单()将 基于网络自动更新工具栏中的菜单项 地位

谁能帮我做这个

**连接活动**
公共类连接活动扩展了AppCompatActivity{
菜单;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_解析器);
}
@凌驾
公共布尔onCreateOptions菜单(菜单){
getMenuInflater().充气(R.menu.internet,menu);
返回super.onCreateOptions菜单(菜单);
}
@凌驾
公共布尔值OnPrepareOptions菜单(菜单){
布尔在线=假;
MenuItem netMenuItem=menu.findItem(R.id.network\u信号);
MenuItem nonetMenuItem=menu.findItem(R.id.network\u signal\u off);
int status=NetworkUtil.getConnectivityStatus(this);
如果(状态==1 | |状态==2)
在线=正确;
其他的
在线=假;
netMenuItem.setVisible(在线);
nonetMenuItem.setVisible(!online);
返回true;
}
}
**NetworkUtil.java**
公共类NetworkUtil{
公共静态int TYPE_WIFI=1;
公共静态int TYPE_MOBILE=2;
公共静态int TYPE_NOT_CONNECTED=0;
公共静态int getConnectionyStatus(上下文){
ConnectionManager cm=(ConnectionManager)上下文
.getSystemService(Context.CONNECTIVITY\u服务);
NetworkInfo activeNetwork=cm.getActiveNetworkInfo();
if(null!=activeNetwork){
if(activeNetwork.getType()==ConnectivityManager.TYPE\u WIFI){
Log.d(“已连接WIFI”,activeNetwork.getType()+”);
返回式无线网络;
}
if(activeNetwork.getType()==ConnectivityManager.TYPE\u MOBILE){
Log.d(“移动连接”,activeNetwork.getType()+”);
返回式_-MOBILE;
}
}
Log.d(“未连接”,键入“未连接+”);
返回类型未连接;
}
公共静态字符串getConnectivityStatusString(上下文){
int conn=NetworkUtil.getConnectivityStatus(上下文);
字符串状态=空;
if(conn==NetworkUtil.TYPE\u WIFI){
status=“Wifi已启用”;
}else if(conn==NetworkUtil.TYPE\u MOBILE){
status=“移动数据已启用”;
}else if(conn==NetworkUtil.TYPE\u未连接){
status=“未连接到Internet”;
}
返回状态;
}
}
**网络更改接收器**
公共类NetworkChangeReceiver扩展了BroadcastReceiver{
@RequiresApi(api=Build.VERSION\u CODES.KITKAT)
@凌驾
公共void onReceive(上下文、意图){
String status=NetworkUtil.getConnectivityStatusString(上下文);
Toast.makeText(上下文、状态、Toast.LENGTH_LONG).show();
Intent-activityIntent=newintent(上下文,ParserActivity.class);
activityIntent.addFlags(Intent.FLAG\u ACTIVITY\u NEW\u TASK);
上下文。开始触觉(活动意图);
}
}
**Menifest.xml**
**internet.xml**

如果调用
invalidateOptions菜单()将触发

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    return super.onPrepareOptionsMenu(menu);
}
所以在这里你可以改变

@Override
    public void onReceive(Context context, Intent intent) {
        //your logic 
        //invalidate the options menu
        invalidateOptionsMenu();
    }

还有另一种方法,而不是调用onPrepareOptions功能表

public class NetworkChangeReceiver extends BroadcastReceiver {
            @Override
            public void onReceive(Context context, Intent intent) {
                try {
                    if (isOnline(context)) {
                        // show online icon
                        ConnectionActivity.setMenuVisible(true);
                    } else {
                       // show offline icon
                        ConnectionActivity.setMenuVisible(false);

                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }

            private boolean isOnline(Context context) {
                try {
                    ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
                    NetworkInfo netInfo = cm.getActiveNetworkInfo();
                    //should check null because in airplane mode it will be null
                    return (netInfo != null && netInfo.isConnected());
                } catch (Exception e) {
                    e.printStackTrace();
                    return false;
                }
            }
        }
=============================================================================

public class ConnectionActivity extends AppCompatActivity {
        Menu menu;
        private BroadcastReceiver mNetworkReceiver;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_parser);
            mNetworkReceiver = new NetworkChangeReceiver();
            registerReceiver(mNetworkReceiver, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));
        }

        @Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.internet, menu);
    this.menu = menu;
    this.menu.findItem(R.id.network_signal).setVisible(false);
    this.menu.findItem(R.id.network_signal_off).setVisible(false);
    return super.onCreateOptionsMenu(menu);
}

        public static void setMenuVisible(boolean isOnline) {
            if (isOnline) {
                if (menu != null) {
                    menu.findItem(R.id.network_signal).setVisible(true);
                    menu.findItem(R.id.network_signal_off).setVisible(false);
                }
            } else {
                if (menu != null) {
                    menu.findItem(R.id.network_signal_off).setVisible(true);
                    menu.findItem(R.id.network_signal).setVisible(false);
                }
            }
        }

        private void unregisterNetworkChanges() {
            try {
                unregisterReceiver(mNetworkReceiver);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        @Override
        public void onDestroy() {
            super.onDestroy();
            unregisterNetworkChanges();
        }
    }

谢谢..工作正常,但在启动应用程序时,它会在工具栏中同时显示两个图标检查我编辑的答案,您可以使两个菜单图标的可见性消失,并根据您的需要使它们可见。如果它工作正常,请接受并更新我的答案。明白@Lucky..但根据网络状态,应该有一个图标,我已修复该问题。谢谢。在广播接收器类获取ClassCastException@vikas Kumari中尝试InvalidateOptions菜单((活动)上下文)时,如果您不是在同一活动中调用,则此操作将无效。否则,您可以设置一些标志来检查int.ernet是否正在工作,然后根据预期的活动检查该活动并绘制菜单。您可以用一些示例代码片段进行解释,因为我是android新手,如果您通过一些示例告诉我这将非常有帮助@vikas
public class ConnectionActivity extends AppCompatActivity {
        Menu menu;
        private BroadcastReceiver mNetworkReceiver;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_parser);
            mNetworkReceiver = new NetworkChangeReceiver();
            registerReceiver(mNetworkReceiver, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));
        }

        @Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.internet, menu);
    this.menu = menu;
    this.menu.findItem(R.id.network_signal).setVisible(false);
    this.menu.findItem(R.id.network_signal_off).setVisible(false);
    return super.onCreateOptionsMenu(menu);
}

        public static void setMenuVisible(boolean isOnline) {
            if (isOnline) {
                if (menu != null) {
                    menu.findItem(R.id.network_signal).setVisible(true);
                    menu.findItem(R.id.network_signal_off).setVisible(false);
                }
            } else {
                if (menu != null) {
                    menu.findItem(R.id.network_signal_off).setVisible(true);
                    menu.findItem(R.id.network_signal).setVisible(false);
                }
            }
        }

        private void unregisterNetworkChanges() {
            try {
                unregisterReceiver(mNetworkReceiver);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        @Override
        public void onDestroy() {
            super.onDestroy();
            unregisterNetworkChanges();
        }
    }