您的位置:首页 > 移动开发 > Android开发

Android导航栏隐藏与浮现

2016-05-25 11:25 453 查看
客户的需求:通过一个app应用中的两个按钮:按钮1--隐藏导航栏,按钮2--浮现导航栏。

解决思路:由于涉及到了上层app与系统应用的通信,决定用广播来做

一.上层app:(只要简单写下两个点击按钮的布局和两个按钮对应发出的广播即可)

按钮布局:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

    xmlns:tools="http://schemas.android.com/tools"

    android:layout_width="match_parent"

    android:layout_height="match_parent" >

    <Button

        android:id="@+id/button1"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:onClick="sendClose"

        android:text="隐藏" />

    <Button

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:layout_alignParentLeft="true"

        android:layout_below="@+id/button1"

        android:onClick="sendOpen"

        android:text="浮现" />

</RelativeLayout>

对应发的广播:

//打开

    public void sendOpen(View v){

        

        Intent intent = new Intent();

        //指定广播所处的动作

        intent.setAction("com.pointercn.showBar");

        sendBroadcast(intent);

    }

    

    

    //关闭

        public void sendClose(View v){

            Intent intent = new Intent();

            //指定广播所处的动作

            intent.setAction("com.pointercn.hideBar");

            sendBroadcast(intent);

        }

二.系统应用(这里要改的地方只有一个,在PhoneStatusBar.java里)

路径:Y:\r58_android4.4_v1.2\android\frameworks\base\packages\SystemUI\src\com\android\systemui\statusbar\phone下PhoneStatusBar.java(Y:\r58_android4.4_v1.2这个就要结合你自己的实际情况了)

这里做的修改:

1.这行 public classPhoneStatusBar extends BaseStatusBar implements DemoMode {下添加两个与广播相关的全局变量:

private final String ACTION_NAME = "com.pointercn.showBar";

 private final String ACTION_NAME1 ="com.pointercn.hideBar";

2.  在start()方法内部,在内部的末尾添加:

public void start() {

。。。。

//动态注册广播监听器

    IntentFilter filter = new IntentFilter();

    filter.addAction("com.pointercn.showBar");

filter.addAction("com.pointercn.hideBar");

mContext.registerReceiver(navBarBroadcastReceiver,filter);

}
3.  start()方法后添加:

start(){
。。。。。。。

}

    private BroadcastReceiver navBarBroadcastReceiver = new LydShowNavigationBarBroadcast();

    private static boolean isNavigationShow = true ;

   // 自定义广播

    class LydShowNavigationBarBroadcast extends  BroadcastReceiver{

    public LydShowNavigationBarBroadcast() {

        super();

    }

    @Override

    public void onReceive(Context context, Intent intent) {

        // Log.d("====>LYD", "receiver show navigation bar broadcast");

            

         String action = intent.getAction();  

         if(action.equals("com.pointercn.showBar")){                    

                    Log.v(TAG, "444444444444444 about to add " + mNavigationBarView);

                    // 防止多次被添加

                if(isNavigationShow){

                return ;

                }    

                    //显示

                showNavigationBar();

                }

                else if(action.equals("com.pointercn.hideBar")){                         

                        Log.v(TAG, "2444 about to add " + mNavigationBarView);

                    if ( mNavigationBarView != null) {

            //隐藏

                        mWindowManager.removeView(mNavigationBarView);;

        }

                        mNavigationBarView = null ;

                    //isNavigationShow用于记录当前导航栏状态,定义在PhoneStatusBar的全局变量中

                    isNavigationShow = false ;

                        

                    }else {

                        return;

                    };                    

    }

    @Override

    public IBinder peekService(Context myContext, Intent service) {

        return super.peekService(myContext, service);

    }

}  

//展示导航栏

public void showNavigationBar() {

    mNavigationBarView =(NavigationBarView) View.inflate(mContext, R.layout.navigation_bar, null);

    mNavigationBarView.setBar(this);

    prepareNavigationBarView();

    addNavigationBar();  

}

这样就能实现客户的需求了。

实现这个功能参考的博客文章:

1.https://codeboy.me/2015/10/22/android_navigation_bar_immerse/

2.http://blog.csdn.net/dliyuedong/article/details/49360807

3.http://blog.csdn.net/chenqian_lj/article/details/17719903
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: