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