android在任意界面弹出popwindow的两种方方法


方法一:创建一个基类,所有的activity都继承自这一个基类,在基类中注册广播接收者,收到弹出popwindow的广播后就弹出广播,需要注意的一点是,当前activity不可见
时是不需要弹出popwindow的,因此需要声明一个变量表示当前activity是否可见。

public
abstract
class
BaseActivity
extends
FragmentActivity
implements
OnClickListener {
protected boolean needPopOrderOver;//当前界面是否可见
@Override
protected void onCreate(Bundle
 savedInstanceState) { 
// TODO Auto-generated method
 stub
super.onCreate(savedInstanceState);
//注册广播
MyReceive myReceive
 = new
MyReceive();
IntentFilter
 filter = new
IntentFilter();
filter.addAction("android.intent.action.order_ok");
registerReceiver(myReceive, filter);
}
@Override
protected void onStop()
 { 
super.onStop();//不可见时
needPopOrderOver = false;
}
@Overrideprotected
 void onStart() { 
super.onStart();//可见时
needPopOrderOver = true;
}
public
class
MyReceive
extends
BroadcastReceiver {
@Override
public void onReceive(Context
 context, Intent intent) {
String
 action = intent.getAction(); 
if
 (Constants.ORDER_OK_ACTION.equals(action))
 { 
//收到广播 弹出popwindow
 } }}
}



方法二:
声明一个activity管理类用来管理当前正在显示的activity,其中最主要的两个方法我用红色标出来
public class MyActivityManager {
    private static MyActivityManager sInstance = new MyActivityManager();
    private WeakReference<Activity> sCurrentActivityWeakRef;
    private MyActivityManager() {

    }

    public static MyActivityManager getInstance() {
        return sInstance;
    }
    public Activity getCurrentActivity() {
        Activity currentActivity = null;
        if (sCurrentActivityWeakRef != null) {
            currentActivity = sCurrentActivityWeakRef.get();
        }
        return currentActivity;
    }
    private static Stack mActivityStack;
    public void setCurrentActivity(Activity activity) {
        sCurrentActivityWeakRef = new WeakReference<Activity>(activity);
    }
    /**
     * 推出栈顶Activity
     */
    public void popActivity(Activity activity) {
        if (activity != null) {
            activity.finish();
            mActivityStack.remove(activity);
            activity = null;
        }
    }

    /**
     * 获得当前栈顶Activity
     */
    public Activity currentActivity() {
        //lastElement()获取最后个子元素,这里是栈顶的Activity
        if(mActivityStack == null || mActivityStack.size() ==0){
            return null;
        }
        Activity activity = (Activity) mActivityStack.lastElement();
        return activity;
    }

    /**
     * 将当前Activity推入栈中
     */
    public void pushActivity(Activity activity) {
        if (mActivityStack == null) {
            mActivityStack = new Stack();
        }
        mActivityStack.add(activity);
    }

    /**
     * 弹出指定的clsss所在栈顶部的中所有Activity
     * @clsss : 指定的类
     */
    public void popTopActivitys(Class clsss) {
        while (true) {
            Activity activity = currentActivity();
            if (activity == null) {
                break;
            }
            if (activity.getClass().equals(clsss)) {
                break;
            }
            popActivity(activity);
        }
    }

    /**
     * 弹出栈中所有Activity
     */
    public void popAllActivitys() {
        while (true) {
            Activity activity = currentActivity();
            if (activity == null) {
                break;
            }
            popActivity(activity);
        }
    }

}


然后在application中:
registerActivityLifecycleCallbacks是application中管理所有activity生命周期的一个方法,可以在该方法中处理我们的需求,当activity不可见和可见时设置刚才创建的
activitymanager中的activity对象,在需要弹出popwondow的地方,直接掉用即可。
@Override
        public void onCreate() {
            super.onCreate();

         
            registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
                @Override
                public void onActivityCreated(Activity activity, Bundle bundle) {

                }

                @Override
                public void onActivityStarted(Activity activity) {
                    MyActivityManager.getInstance().setCurrentActivity(activity);
                }

                @Override
                public void onActivityResumed(Activity activity) {

                }

                @Override
                public void onActivityPaused(Activity activity) {
                    MyActivityManager.getInstance().setCurrentActivity(null);
                }

                @Override
                public void onActivityStopped(Activity activity) {

                }

                @Override
                public void onActivitySaveInstanceState(Activity activity, Bundle bundle) {

                }

                @Override
                public void onActivityDestroyed(Activity activity) {

                }
            });
        }


//调用方法:
MyActivityManager.getInstance().getCurrentActivity()// 就是当前正在运行的activity,然后弹出popwindow即可。


















  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,可以通过弹出一个带有指示器的PopupWindow来实现。 在VerticalSeekBar类中添加以下代码: ```java private PopupWindow popupWindow; private TextView textView; public void showIndicator(int progress) { if (popupWindow == null) { textView = new TextView(getContext()); textView.setTextColor(Color.WHITE); textView.setTextSize(14); textView.setGravity(Gravity.CENTER); textView.setBackgroundResource(R.drawable.seekbar_indicator_bg); popupWindow = new PopupWindow(textView, LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); popupWindow.setOutsideTouchable(true); popupWindow.setFocusable(false); } int[] location = new int[2]; getLocationOnScreen(location); int thumbTop = (int) ((getHeight() - getThumb().getIntrinsicHeight()) * 0.5f); int thumbLeft = (int) ((getWidth() - getThumb().getIntrinsicWidth()) * 0.5f); int thumbWidth = getThumb().getIntrinsicWidth(); int thumbHeight = getThumb().getIntrinsicHeight(); int indicatorWidth = dp2px(getContext(), 40); int indicatorHeight = dp2px(getContext(), 20); int indicatorX = location[0] - indicatorWidth - thumbWidth; int indicatorY = location[1] + (getHeight() - indicatorHeight) * progress / getMax() - thumbTop; textView.setText(String.valueOf(progress)); popupWindow.showAtLocation(this, Gravity.NO_GRAVITY, indicatorX, indicatorY); } public void hideIndicator() { if (popupWindow != null) { popupWindow.dismiss(); } } private int dp2px(Context context, int dp) { float density = context.getResources().getDisplayMetrics().density; return (int) (dp * density + 0.5f); } ``` 在Activity中,可以这样使用: ```java VerticalSeekBar verticalSeekBar = findViewById(R.id.vertical_seekbar); verticalSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { verticalSeekBar.showIndicator(progress); } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onStopTrackingTouch(SeekBar seekBar) { verticalSeekBar.hideIndicator(); } }); ``` 在onProgressChanged()方法弹出PopupWindow,并在PopupWindow中显示进度值。在onStopTrackingTouch()方法中隐藏PopupWindow。 这样就可以通过弹出PopupWindow在滑块旁边显示进度值了。PopupWindow的位置使用了SeekBar的getLocationOnScreen()方法和一些计算。PopupWindow的大小为40dp * 20dp,背景使用了一个Drawable资源。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值