Jacksgong / JKeyboardPanelSwitch

For resolve the layout conflict when keybord & panel are switching (Android键盘面板冲突 布局闪动处理方案)
Apache License 2.0
4.18k stars 684 forks source link

继承自FragmentActivity 时,计算键盘是否显示出现偏差 #24

Closed Jacksgong closed 8 years ago

Jacksgong commented 8 years ago

对比两个栈

使用 FragmentActivityActivity时 整个布局的层级关系:

View Hierarchy:
      com.android.internal.policy.PhoneWindow$DecorView{287b762 V.E..... ... 0,0-1080,1920}
        android.widget.LinearLayout{b8a7d7b V.E..... ... 0,0-1080,1776}
          android.view.ViewStub{32bf62d G.E..... ... 0,0-0,0 #10203ab android:id/action_mode_bar_stub}
          android.widget.FrameLayout{4551798 V.E..... ... 0,72-1080,1776 #1020002 android:id/content}
            cn.dreamtobe.kpswitch.widget.KPSwitchRootLinearLayout{5ea5536 V.E..... ... 0,0-1080,1704 #7f0b0052 app:id/rootView}
              android.support.v7.widget.RecyclerView{880ec37 VFED.... F.. 0,0-1080,1539 #7f0b0068 app:id/content_ryv}
              android.widget.LinearLayout{6785a4 VFE..... ... 0,1539-1080,1704 #7f0b0053 app:id/sendMsgLayout}
                android.widget.ImageView{7a40f0d V.ED.... ... 30,34-126,130 #7f0b0054 app:id/voice_text_switch_iv}
                android.widget.RelativeLayout{e7e8ec2 V.E..... ... 150,25-900,139}
                  android.widget.EditText{76e14d3 VFED..CL ... 0,0-750,114 #7f0b0055 app:id/send_edt}
                  android.widget.TextView{2695810 G.ED..C. ... 0,0-0,0 #7f0b0056 app:id/send_voice_btn}
                android.widget.RelativeLayout{c0f8f09 V.E..... ... 900,0-1080,165}
                  android.widget.ImageView{a2ad50e V.ED..C. ... 42,34-138,130 #7f0b0057 app:id/plus_iv}
                  android.widget.TextView{7fb2b2f G.ED..C. ... 0,0-0,0 #7f0b0058 app:id/send_btn}
              cn.dreamtobe.kpswitch.widget.KPSwitchPanelLinearLayout{273e53c G.E..... ... 0,0-0,0 #7f0b0051 app:id/panel_root}
                android.view.View{39912c5 V.ED.... ... 0,0-0,0}
                android.widget.LinearLayout{543341a V.E..... ... 0,0-0,0 #7f0b0059 app:id/panel_content}
                  android.widget.TextView{d994b4b V.ED..C. ... 0,0-0,0 #7f0b005a app:id/send_img_tv}
                  android.widget.TextView{6381928 V.ED.... ... 0,0-0,0}
        android.view.View{a7d1641 V.ED.... ... 0,1776-1080,1920 #1020030 android:id/navigationBarBackground}
        android.view.View{57520f3 V.ED.... ... 0,0-1080,72 #102002f android:id/statusBarBackground}

使用 AppCompatActivity时 整个布局的层级关系:

View Hierarchy:
      com.android.internal.policy.PhoneWindow$DecorView{9b17588 V.E..... ... 0,0-1080,1920}
        android.widget.LinearLayout{18eab21 V.E..... ... 0,0-1080,1776}
          android.view.ViewStub{e691b46 G.E..... ... 0,0-0,0 #10203ab android:id/action_mode_bar_stub}
          android.widget.FrameLayout{7342107 V.E..... ... 0,72-1080,1776}
            android.support.v7.widget.ActionBarOverlayLayout{5ac6234 V.E..... ... 0,0-1080,1704 #7f0b0040 app:id/decor_content_parent}
              android.support.v7.widget.ContentFrameLayout{889d85d V.E..... ... 0,168-1080,1704 #1020002 android:id/content}
                cn.dreamtobe.kpswitch.widget.KPSwitchRootLinearLayout{78ba5d2 V.E..... ... 0,0-1080,1536 #7f0b0052 app:id/rootView}
                  android.support.v7.widget.RecyclerView{567c6a3 VFED.... F.. 0,0-1080,1371 #7f0b0068 app:id/content_ryv}
                  android.widget.LinearLayout{c76da0 VFE..... ... 0,1371-1080,1536 #7f0b0053 app:id/sendMsgLayout}
                    android.support.v7.widget.AppCompatImageView{2109d59 V.ED.... ... 30,34-126,130 #7f0b0054 app:id/voice_text_switch_iv}
                    android.widget.RelativeLayout{cda4d1e V.E..... ... 150,25-900,139}
                      android.support.v7.widget.AppCompatEditText{fa629ff VFED..CL ... 0,0-750,114 #7f0b0055 app:id/send_edt}
                      android.support.v7.widget.AppCompatTextView{4c5c3cc G.ED..C. ... 0,0-0,0 #7f0b0056 app:id/send_voice_btn}
                    android.widget.RelativeLayout{5a4b615 V.E..... ... 900,0-1080,165}
                      android.support.v7.widget.AppCompatImageView{fda1d2a V.ED..C. ... 42,34-138,130 #7f0b0057 app:id/plus_iv}
                      android.support.v7.widget.AppCompatTextView{d3d671b G.ED..C. ... 0,0-0,0 #7f0b0058 app:id/send_btn}
                  cn.dreamtobe.kpswitch.widget.KPSwitchPanelLinearLayout{27150b8 G.E..... ... 0,0-0,0 #7f0b0051 app:id/panel_root}
                    android.view.View{7279e91 V.ED.... ... 0,0-0,0}
                    android.widget.LinearLayout{354e1f6 V.E..... ... 0,0-0,0 #7f0b0059 app:id/panel_content}
                      android.support.v7.widget.AppCompatTextView{24159f7 V.ED..C. ... 0,0-0,0 #7f0b005a app:id/send_img_tv}
                      android.support.v7.widget.AppCompatTextView{b46c064 V.ED.... ... 0,0-0,0}
              android.support.v7.widget.ActionBarContainer{d1692cd V.ED.... ... 0,0-1080,168 #7f0b0041 app:id/action_bar_container}
                android.support.v7.widget.Toolbar{ae52782 V.E..... ... 0,0-1080,168 #7f0b0042 app:id/action_bar}
                  android.widget.TextView{6279e93 V.ED.... ... 48,43-468,124}
                  android.support.v7.widget.ActionMenuView{9e17ed0 V.E..... ... 1080,0-1080,168}
                android.support.v7.widget.ActionBarContextView{e868ec9 G.E..... ... 0,0-0,0 #7f0b0043 app:id/action_context_bar}
        android.view.View{74239ce V.ED.... ... 0,1776-1080,1920 #1020030 android:id/navigationBarBackground}
        android.view.View{82390ef V.ED.... ... 0,0-1080,72 #102002f android:id/statusBarBackground}

其实整个项目是根据 AppCompatActivity适配起来的。

而很显然在 ActivityFragmentActivity 的布局中 contentViewparentandroid.widget.LinearLayout{b8a7d7b V.E..... ... 0,0-1080,1776} 而这个布局的父布局直接就是 DecorView,并且通过分析,获知 这边这个 contentViewparent的高度会等于 DecorViewHeight - NavigationBarHeight,因此就我们的适配中的键盘高度计算,是依赖这个布局的高度变化的只考虑了 AppCompatActivity 的情况,没有覆盖这个情况,这边需要对这个情况进行覆盖,以防止键盘是否显示计算出错。