Reputation: 43
I am beginner to android,I have included 2 icons in internet.xml ,based on the network connection(Example if network is connected it should show connected icon or else it should show not connected icon on the toolbar),for that I have created onPrepareOptionsMenu() in activity as well as BroadcastReceiver to broadcast the present network status based on that the icon has to change dynamically.
Here I have used Intent to broadcast the current network status,it is again relaunching the activity,I don't know how to call onPrepareOptionsMenu() inside the BroadcastReceiver class to automatically update menu items in toolbar based on the network status.
Can anyone help me to do this?.
**ConnectionActivity**
public class ConnectionActivity extends AppCompatActivity {
Menu menu;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_parser);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.internet, menu);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
boolean online = false;
MenuItem netMenuItem = menu.findItem(R.id.network_signal);
MenuItem nonetMenuItem = menu.findItem(R.id.network_signal_off);
int status = NetworkUtil.getConnectivityStatus(this);
if (status == 1 || status == 2)
online = true;
else
online = false;
netMenuItem.setVisible(online);
nonetMenuItem.setVisible(!online);
return true;
}
}
**NetworkUtil.java**
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) {
Log.d("WIFI CONNECTED", activeNetwork.getType() + "");
return TYPE_WIFI;
}
if (activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE) {
Log.d("MOBILE CONNECTED", activeNetwork.getType() + "");
return TYPE_MOBILE;
}
}
Log.d("NOT CONNECTED", TYPE_NOT_CONNECTED + "");
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;
}
}
**NetworkChangeReceiver**
public class NetworkChangeReceiver extends BroadcastReceiver {
@RequiresApi(api = Build.VERSION_CODES.KITKAT)
@Override
public void onReceive(Context context, Intent intent) {
String status = NetworkUtil.getConnectivityStatusString(context);
Toast.makeText(context, status, Toast.LENGTH_LONG).show();
Intent activityIntent = new Intent(context, ParserActivity.class);
activityIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(activityIntent);
}
}
**Menifest.xml**
<receiver
android:name=".NetworkChangeReceiver"
android:enabled="true"
android:exported="false">
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
<action android:name="android.net.wifi.WIFI_STATE_CHANGED" />
</intent-filter>
</receiver>
**internet.xml**
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:title="signal_off"
android:id="@+id/network_signal_off"
android:icon="@drawable/ic_signal_wifi_off_black_24dp"
app:showAsAction="always"></item>
<item
android:id="@+id/network_signal"
android:icon="@drawable/ic_signal_wifi_4_bar_black_24dp"
android:title="Signal"
app:showAsAction="always"></item>
</menu>
Upvotes: 1
Views: 1567
Reputation: 713
There is another way of doing so, not by calling onPrepareOptionsMenu
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();
}
}
Upvotes: 0
Reputation: 11018
if you call invalidateOptionsMenu();
which will trigger the
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
return super.onPrepareOptionsMenu(menu);
}
so in here you make the change
@Override
public void onReceive(Context context, Intent intent) {
//your logic
//invalidate the options menu
invalidateOptionsMenu();
}
Upvotes: 2