在android 软件第一次使用的时候,一般会在当前的界面上做一个灰色的蒙版,上面有显示的一些提醒性质的教学文字或者图案。
我想的是当前界面上蒙上一个 Fragment 把提示信息也放在Fragment上。
这是效果图。后面附上demo源码。
具体就是在activity成功启动之后。画出activity的view之后。这个不能在生命周期进行判断。我尝试的是用Handler去不断postDelay查看view是否被画出。即view的width > 0.
然后用代码动态的把这个蒙版Fragment加入到当前的Activity之中。
- @Override
- protected void onCreate(Bundle savedInstanceState)
- {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- rootView = findViewById(R.id.root);
- final Handler mHandler = new Handler();
- //不断延时 看view是否被加载出来。
- mHandler.postDelayed(new Runnable()
- {
- @Override
- public void run()
- {
- if(rootView.getWidth() > 0){
- //把蒙版加载到当前的页面上
- detailsAssertFragment = new MyJobDetailsAssertFragment();
- getFragmentManager().beginTransaction()
- .add(R.id.root, detailsAssertFragment)
- .commit();
- }else {
- mHandler.postDelayed(this, 100);
- }
- }
- },300);
- }
注意的是R.id.root不是 detailAssertFragment的Id。这个函数的意思是把蒙版detailAssertFragment 加入到id是R.id.root的ViewGroup中。
我发现如果id为R.id.root的view 如果不是FrameLayout就无法添加蒙版成功。
看看蒙版Fragment的代码
- public class MyJobDetailsAssertFragment extends Fragment{
- public void MyJobDetailsAssertFragment(){
- }
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container,
- Bundle savedInstanceState)
- {
- View view = inflater.inflate(R.layout.my_jobs_details_assert, null);
- //根据需求设定蒙版遮盖的位置。(这没有遮盖Actionbar,根据要求自行调整)
- LayoutParams params= new LayoutParams(rootView.getWidth(),rootView.getHeight());
- view.setLayoutParams(params);
- view.setOnClickListener(new OnClickListener()
- {
- @Override
- public void onClick(View v)
- {
- //蒙版点击一下之后消失的处理
- getFragmentManager().beginTransaction()
- .remove(detailsAssertFragment)
- .commit();
- showAssert = false;
- }
- });
- showAssert = true;
- return view;
- }
- }
实现的蒙版就已经是半透明的。不用再去设置他的透明度。蒙版的样式就在DetailAssertFragment加载的XML自己设置摆放图案。