android 获取当前显示的activity和收起虚拟键盘

项目中需要展现一个控件,而且这个控件在任意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马上到来

猜你喜欢

转载自blog.csdn.net/lu_ca/article/details/78875674
今日推荐