项目中需要展现一个控件,而且这个控件在任意activity中都可以展示。类似于一个Toast。之前用了一个自定义的ImageToast继承自系统的Toast。但是,系统的东西虽好,还是需要付出代价。我想在用户动作的时候能够迅速作出回应。例如弹出这个ImageToast,但是系统的Toast只有两个显示时间。一个是Toast.LENGTH_LONG和一个Toast.LENGTH_SHORT。而且系统在展示一个新的toast之前需要等到现在显示的toast结束,否则就要等它展示完。即便是short类型的时间也不是那么短。没办法只能走上一条自定义一个类似于系统toast功能的带有自定义样式的东西。既然要展示这个东西,肯定需要先取得当前是在哪个控制器。
首先,需要一个自定义的类,这个类用来返回当前的activity,也就是方法getCurrentActivity();
在基类BaseActivity的Resume()函数中,需要先设置为当前有效的activity。于是在BaseActivity中就有了
protected void onResume() {
super.onResume();
MyActivityManager.getInstance().setCurrentActivity(this);
}
这个MyActivityManager就是自定义用来返回当前activity的类。这个类的实现代码如下
package com.scwindow;
import java.lang.ref.WeakReference;
import android.app.Activity;
public class MyActivityManager {
private static MyActivityManager sInstance = new MyActivityManager();
private static WeakReference<Activity> sCurrentActivityWeakRef;
private MyActivityManager() {
}
public static MyActivityManager getInstance() {
return sInstance;
}
public static Activity getCurrentActivity() {
Activity currentActivity = null;
if (sCurrentActivityWeakRef != null) {
currentActivity = sCurrentActivityWeakRef.get();
}
return currentActivity;
}
public void setCurrentActivity(Activity activity) {
sCurrentActivityWeakRef = new WeakReference<Activity>(activity);
}
}
经过一次次的实验,发现方法可行。而且所有的activity都是继承自BaseActivity。
二、收起虚拟键盘
基本这个方法都能找到
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(editText.getWindowToken(), 0) ;
但是这个方法我的行不通,我的需要方法类型是static类型的,而这个不是static类型的。
然后,最后终于找到了这个方法
Activity activity = MyActivityManager.getCurrentActivity();
if(activity != null){
View v = activity.getCurrentFocus();
InputMethodManager imm = (InputMethodManager)activity.getSystemService(Context.INPUT_METHOD_SERVICE);
if(imm != null)
imm.hideSoftInputFromWindow(v.getWindowToken(), 0) ;
}
这个方法中需要用一个activity来收起键盘,然而刚刚我已经能拿到当前activity了,直接调用,有效果。
写android不到一年,磕磕碰碰,遇到问题就查资料,自己理解这去解决,不一定写的多专业,也不一定效果多好,希望自己越努力越幸福吧 ———-致自己
2017年最后的几天新的2018马上到来