Android开发之控制Toast的开启与关闭

2014-08-09 00:02:17来源:http://blog.csdn.net/fengyuzhengfan/article/details/38438931作者:590人点击


开发这个程序之前先解释一下,为什么Toast信息提示框在显示一定时间后会自动消失?因为在Android系统中有一个Toast队列,系统会依次从这个队列中取出一个Toast,并显示它。在显示了指定时间之后,便关闭它。那么可不可以让Toast信息提示框一直显示呢?这个要求对于Toast来说有点强人所难了,因为,Toast本身并没有提供这个功能。那么怎么才能让Toast一直显示,并在我们的控制之下关闭呢?代码是死的,人是活的。下面就叫代码说话:

看一下Toast的show方法的源码:

public void show() {

if (mNextView == null) {

throw new RuntimeException("setView must have been called");

}

INotificationManager service = getService();

String pkg = mContext.getPackageName();

TN tn = mTN;

tn.mNextView = mNextView;

try {

service.enqueueToast(pkg, tn, mDuration);

} catch (RemoteException e) {

// Empty

}

}


在上面的代码中Toast已经告诉我们了,它本身并不负责信息提示框的显示与关闭,它只是将Toast加入到系统的Toast队列中,再由系统根据Toast队列来显示和关闭Toast信息提示框。现在我们可以做一个大胆的推断,既然Toast的show方法是将Toast放到系统的Toast队列中,那么我们就不使用show方法,我们自己来控制Toast的显示与关闭。

查看Toast类源码可以找到一个TN类,该类是Toast的一个内嵌类。在TN类中有个show方法,系统是从Toast队列中获得Toast对象之后,利用TN对象的show方法显示Toast再利用TN.hide方法关闭Toast。如果我们能够获取TN对象那么就能控制Toast的显示与关闭。但TN被声明成private,外部无法访问。不过Toast类中有个mTN对象,虽然它不是我public但我们可以通过Java反射技术来访问该对象。mTN会在创建Toast对象时初始化。所以,只要获得mTN对象也就获得了TN对象。下面代码显示了一个永不关闭的Toast信息提示框。

Toast toast = Toast.makeText(context, msg, Toast.LENGTH_SHORT);

//设置Toast的显示位置

toast.setGravity(Gravity.TOP | Gravity.CENTER_HORIZONTAL, 0, 0);

try{

 //通过反射技术,从toast对象中获取mTN对象

Field field = toast.getClass().getDeclaredField("mTN");

field.setAccessible(true);

obj = field.get(toast);

 //从TN对象中获得show方法

Method method = obj.getClass().getDeclaredMethod("show", null);

//调用TN对象的show方法来显示Toast信息提示框

 method.invoke(obj, null);

}catch (Exception e){

}


上面代码先通过事先创建好的Toast对象获得mTN对象,然后在利用反射技术获得TN对象的show方法。

关闭Toast的方法和显示Toast的方法类似,只需要获得hide方法即可。
Method method = obj.getClass().getDeclaredMethod("hide", null);method.invoke(obj, null);
程序运行效果图:


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一份简单的Android wifi开发程序,适配android 11,包括wifi打开、关闭、扫描、连接和断开。 Java代码: ```java import android.Manifest; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.pm.PackageManager; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.net.wifi.WifiConfiguration; import android.net.wifi.WifiInfo; import android.net.wifi.WifiManager; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.util.Log; import android.widget.Toast; import androidx.annotation.NonNull; import androidx.annotation.RequiresApi; import androidx.appcompat.app.AppCompatActivity; import androidx.core.app.ActivityCompat; import androidx.core.content.ContextCompat; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; @RequiresApi(30) public class MainActivity extends AppCompatActivity { private final int REQUEST_CODE_LOCATION_PERMISSION = 100; private final int REQUEST_CODE_WIFI_PERMISSION = 101; private WifiManager wifiManager; private boolean isWifiEnabled; private WifiScanReceiver wifiScanReceiver; private List<WifiConfiguration> wifiConfigurations; private List<WifiInfo> wifiInfos; private List<ScanResult> scanResults; private boolean isConnected; private Handler handler; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); wifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE); isWifiEnabled = wifiManager.isWifiEnabled(); wifiScanReceiver = new WifiScanReceiver(); wifiConfigurations = wifiManager.getConfiguredNetworks(); wifiInfos = new ArrayList<>(); scanResults = new ArrayList<>(); isConnected = false; handler = new Handler(Looper.getMainLooper()); if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, REQUEST_CODE_LOCATION_PERMISSION); } else { enableWifi(); } } @Override protected void onResume() { super.onResume(); IntentFilter intentFilter = new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION); registerReceiver(wifiScanReceiver, intentFilter); } @Override protected void onPause() { super.onPause(); unregisterReceiver(wifiScanReceiver); } @Override protected void onDestroy() { super.onDestroy(); disconnect(); disableWifi(); } private void enableWifi() { if (!isWifiEnabled) { if (ContextCompat.checkSelfPermission(this, Manifest.permission.CHANGE_WIFI_STATE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CHANGE_WIFI_STATE}, REQUEST_CODE_WIFI_PERMISSION); } else { wifiManager.setWifiEnabled(true); isWifiEnabled = true; Toast.makeText(this, "开启Wifi", Toast.LENGTH_SHORT).show(); } } } private void disableWifi() { if (isWifiEnabled) { if (ContextCompat.checkSelfPermission(this, Manifest.permission.CHANGE_WIFI_STATE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CHANGE_WIFI_STATE}, REQUEST_CODE_WIFI_PERMISSION); } else { wifiManager.setWifiEnabled(false); isWifiEnabled = false; Toast.makeText(this, "关闭Wifi", Toast.LENGTH_SHORT).show(); } } } private void scanWifi() { if (isWifiEnabled) { wifiManager.startScan(); Toast.makeText(this, "开始扫描Wifi", Toast.LENGTH_SHORT).show(); } } private void connect(WifiConfiguration wifiConfiguration) { if (isWifiEnabled) { int networkId = wifiManager.addNetwork(wifiConfiguration); if (networkId != -1) { wifiManager.saveConfiguration(); wifiManager.disconnect(); wifiManager.enableNetwork(networkId, true); wifiManager.reconnect(); isConnected = true; Toast.makeText(this, "已连接Wifi", Toast.LENGTH_SHORT).show(); } else { isConnected = false; Toast.makeText(this, "连接Wifi失败", Toast.LENGTH_SHORT).show(); } } } private void disconnect() { if (isWifiEnabled && isConnected) { wifiManager.disconnect(); isConnected = false; Toast.makeText(this, "已断开Wifi连接", Toast.LENGTH_SHORT).show(); } } private void requestLocationPermission() { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, REQUEST_CODE_LOCATION_PERMISSION); } private void requestWifiPermission() { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CHANGE_WIFI_STATE}, REQUEST_CODE_WIFI_PERMISSION); } // 单独提取出请求权限的onRequestPermissionsResult方法,后续修改方便 @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { if (requestCode == REQUEST_CODE_LOCATION_PERMISSION) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { enableWifi(); } else { Toast.makeText(this, "请求位置权限失败,无法开启Wifi", Toast.LENGTH_SHORT).show(); } } if (requestCode == REQUEST_CODE_WIFI_PERMISSION) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { if (isWifiEnabled) { disableWifi(); } else { enableWifi(); } } else { Toast.makeText(this, "请求Wifi权限失败", Toast.LENGTH_SHORT).show(); } } } // Broadcast Receiver private class WifiScanReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)) { scanResults = wifiManager.getScanResults(); sortScanResultsByLevel(); Toast.makeText(context, "扫描结束,共找到" + scanResults.size() + "个Wifi", Toast.LENGTH_SHORT).show(); } } } // 排序 private void sortScanResultsByLevel() { Collections.sort(scanResults, new Comparator<ScanResult>() { @Override public int compare(ScanResult o1, ScanResult o2) { return o2.level - o1.level; } }); } // 获取连接状态 private boolean getConnectivityStatus() { ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo(); if (networkInfo != null && networkInfo.isConnectedOrConnecting()) { return true; } else { return false; } } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值