[안드로이드 학습] 안드로이드 4.4 침몰 모드의 진입 및 종료 시 시스템 표시줄 상태 표시줄에 문제를 숨깁니다

5082 단어 android
안드로이드 배우기 4.4 몰입 모드에서 링크를 여는 블로거를 클릭하면 아래의 문제를 비교적 전면적으로 쓸 수 있으니 참고하시기 바랍니다.
  • 침몰 모드가 종료될 때 시스템 표시줄과 상태 표시줄은 화면 문제를 숨깁니다
  • Activity에 진입하고 Activity를 전환할 때 침착 모드를 전환하는 방법
  • 단 보충: 침몰 모드를 종료할 때 시스템 표시줄과 상태 표시줄을 복구할 때 setSystemUiVisibility를 호출한 후 화면의 편향 높이 Top을 직접 찾을 때
    <pre name="code" class="java">Rect frame = new Rect();
    topView.getWindowVisibleDisplayFrame(frame) ;
    int height = frame.top;
     
      
     

    heightの值为0,因此画面还是因为没有计算系统栏的高度被遮盖了一半。

    该height=0应该是此时还没被UI线程更新和赋值。

    解决方法是将获取系统栏和状态栏的高度放在一个UI线程的handler里面去排队执行。

    public class MainActivity extends Activity implements OnClickListener{
    
        LinearLayout rl;
        View topView;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            
            ActionBar actionBar = getActionBar();
            actionBar.setDisplayHomeAsUpEnabled(true);
            actionBar.setHomeButtonEnabled(true);
            
            // activity_main ID
            rl = (LinearLayout)findViewById(R.id.rl);
            
            topView = getWindow().getDecorView();
            rl.setPadding(0, 0, 0, 0);
            Button btOn = (Button) findViewById(R.id.on);
            btOn.setOnClickListener(this);
            
            Button btOff = (Button) findViewById(R.id.off);
            btOff.setOnClickListener(this);
        }
    
        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            // TODO Auto-generated method stub
            switch(item.getItemId()){
            case android.R.id.home:
                finish();
                break;
            }
            
            return super.onOptionsItemSelected(item);
        }
    
        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
    
            switch (v.getId()) {
            case R.id.on:
                hideSystemUI(topView);
                rl.setPadding(0, 0, 0, 0);
                break;
            case R.id.off:
                showSystemUI(topView);
                topView.postInvalidate();
                //   UI   handler    
                Message msg = new Message();
                msg.what = 1;
                this.validateHandler.sendMessage(msg);
                
                break;
            default:
                break;
            }
            
        }
        
         private Handler validateHandler = new  Handler() {  
            
                @Override  
                public void handleMessage(Message msg)  {  
                    switch (msg.what)  
                    {  
                    case 1:  
                        Rect frame = new Rect();
                        topView.getWindowVisibleDisplayFrame(frame);
                        int paddingTop = getActionBar().getHeight()+ frame.top;
                        rl.setPadding(0, paddingTop, 0, 0);
                        break;  
                    }  
                    super.handleMessage(msg);  
                }  
            };  
    
          public static void hideSystemUI(View view) {
                    view.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                               | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                               | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                               | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                               | View.SYSTEM_UI_FLAG_FULLSCREEN
                               | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
         }
               
           @SuppressLint("NewApi")
           public static void showSystemUI(View view) {
               view.setSystemUiVisibility(
                       View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                       | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                       | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
           }
           
    
           @Override
           public boolean onCreateOptionsMenu(Menu menu) {
               // Inflate the menu; this adds items to the action bar if it is present.
               getMenuInflater().inflate(R.menu.main, menu);
               return true;
           }
    }

    이 블로거가 나중에 대답했다. 사실 반사 방법을 통해 시스템에서 actionbar와 Statusbar의 높이를 직접 꺼낼 수 있는 것도 좋은 방법이다. 여기서 인용해 보자.
        //          
    public static int getStatusBarHeight(Context context) {
        Class<?> c = null;
        Object obj = null;
        Field field = null;
        int x = 0, statusBarHeight = 0;
        try {
            c = Class.forName("com.android.internal.R$dimen");
            obj = c.newInstance();
            field = c.getField("status_bar_height");
            x = Integer.parseInt(field.get(obj).toString());
            statusBarHeight = context.getResources().getDimensionPixelSize(x);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return statusBarHeight;
    }
     
    //   ActionBar   
    public static int getActionBarHeight(Context context) {
        TypedValue tv = new TypedValue();
        int actionBarHeight = 0;
        if (context.getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true))
        {
            actionBarHeight = TypedValue.complexToDimensionPixelSize(tv.data, context.getResources().getDisplayMetrics());
        }
        return actionBarHeight;
    }

    좋은 웹페이지 즐겨찾기