Android贴吧系统学习-----悬浮布局的做法
时间:2022-06-25
本文章向大家介绍Android贴吧系统学习-----悬浮布局的做法,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
<span style="font-size:18px;"><strong>
//悬浮窗口
private LinearLayout mFloatLayout;
private WindowManager.LayoutParams wmParams;
//创建浮动窗口设置布局参数的对象
private WindowManager mWindowManager;
private boolean isFloatAttached = false;
private int tabPosition = 0;
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
if(tabPosition == 2 && isFloatAttached == false)
createFloatView();
}
@Override
protected void onStop() {
// TODO Auto-generated method stub
super.onStop();
if(null != mFloatLayout && isFloatAttached == true)
{
mWindowManager.removeView(mFloatLayout);
isFloatAttached = false;
}
}
@Override
protected void onSaveInstanceState(Bundle outState) {
// TODO Auto-generated method stub
super.onSaveInstanceState(outState);
outState.putInt("position", tabPosition);
outState.putBoolean("is_attached", isFloatAttached);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onRestoreInstanceState(savedInstanceState);
tabPosition = savedInstanceState.getInt("position");
isFloatAttached = savedInstanceState.getBoolean("is_attached");
}
switch (checkedIndex) {
case 0:
////////////
tabPosition = 0;
if(null != mFloatLayout && isFloatAttached == true)
{
mWindowManager.removeView(mFloatLayout);
isFloatAttached = false;
}
/////////////////
fragment = fragments.get(0);//对应编号为0的fragment
transaction.replace(R.id.main_framelayout, fragment);
transaction.commit();
title.setText("菜单1");
break;
case 1:
tabPosition = 1;
if(null != mFloatLayout && isFloatAttached == true)
{
mWindowManager.removeView(mFloatLayout);
isFloatAttached = false;
}
fragment = fragments.get(1);////对应编号为1的fragment
transaction.replace(R.id.main_framelayout, fragment);
transaction.commit();
title.setText("菜单2");
break;
case 2:
tabPosition = 2;
if(isFloatAttached == false)
createFloatView();
//这里放置的是发布
break;
case 3:
tabPosition = 3;
if(null != mFloatLayout && isFloatAttached == true)
{
mWindowManager.removeView(mFloatLayout);
isFloatAttached = false;
}
fragment = fragments.get(2);//对应编号为2的fragment
transaction.replace(R.id.main_framelayout, fragment);
transaction.commit();
title.setText("菜单4");
break;
case 4:
tabPosition = 4;
if(null != mFloatLayout && isFloatAttached == true)
{
mWindowManager.removeView(mFloatLayout);
isFloatAttached = false;
}
fragment = fragments.get(3);//对应编号为3的fragment
transaction.replace(R.id.main_framelayout, fragment);
transaction.commit();
title.setText("菜单5");
break;
default:
break;
}
//添加浮动窗口
private void createFloatView()
{
wmParams = new WindowManager.LayoutParams();
//获取的是WindowManagerImpl.CompatModeWrapper
mWindowManager = (WindowManager)getApplication().getSystemService(getApplication().WINDOW_SERVICE);
//设置window type
wmParams.type = LayoutParams.TYPE_PHONE;
//设置图片格式,效果为背景透明
wmParams.format = PixelFormat.RGBA_8888;
//设置浮动窗口不可聚焦(实现操作除浮动窗口外的其他可见窗口的操作)
wmParams.flags = LayoutParams.FLAG_NOT_FOCUSABLE;
//调整悬浮窗显示的停靠位置为左侧置顶
wmParams.gravity = Gravity.RIGHT| Gravity.BOTTOM;
// 以屏幕左上角为原点,设置x、y初始值,相对于gravity
wmParams.x = Dp2Px(getApplicationContext(), 20);
wmParams.y = Dp2Px(getApplicationContext(), 80);
//设置悬浮窗口长宽数据
wmParams.width = WindowManager.LayoutParams.WRAP_CONTENT;
wmParams.height = WindowManager.LayoutParams.WRAP_CONTENT;
/*// 设置悬浮窗口长宽数据
wmParams.width = 200;
wmParams.height = 80;*/
LayoutInflater inflater = LayoutInflater.from(getApplication());
//获取浮动窗口视图所在布局
mFloatLayout = (LinearLayout) inflater.inflate(R.layout.tieba_add_float, null);
//添加mFloatLayout
mWindowManager.addView(mFloatLayout, wmParams);
isFloatAttached = true;
//浮动窗口按钮
mFloatLayout.measure(View.MeasureSpec.makeMeasureSpec(0,
View.MeasureSpec.UNSPECIFIED), View.MeasureSpec
.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
//设置监听浮动窗口的触摸移动
ImageView addImg = (ImageView)mFloatLayout.findViewById(R.id.add_float);
addImg.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
startActivity(new Intent(NewStartActivity.this,WritePostActivity.class));
}
});
}
</strong></span>
在上面我的菜单用的是 radioGruop控件,只需要在自己需要的界面中把悬浮布局弄出来就行,
另外在onstop 和onresume生命周期里面也需要控制下,
- Golang语言关于零值的定义
- 使用Yeoman创建ASP.NET Core项目
- Golang语言捕获panic异常并转化为error
- 在Windows下安装TensorFlow
- JavaFX——(第一篇:介绍篇)
- 自编码器是什么?有什么用?这里有一份入门指南(附代码)
- UWP基础教程 - {x:DeferLoadStrategy}
- UWP基础教程 - 重启应用
- html5打开摄像头
- UWP基础教程 - App多语言支持
- Golang实现Fibonacii的几种算法
- 【译】使用 dotnet watch 开发 ASP.NET Core 应用
- vmware安装ubuntu12.04嵌套安装xen server(实现嵌套虚拟化)
- Golang语言切片slice的线程协程安全问题
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释