[안드로이드 학습] 안드로이드 4.4 침몰 모드의 진입 및 종료 시 시스템 표시줄 상태 표시줄에 문제를 숨깁니다
5082 단어 android
<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; }
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Kotlin의 기초 - 2부지난 글에서는 Kotlin이 무엇인지, Kotlin의 특징, Kotlin에서 변수 및 데이터 유형을 선언하는 방법과 같은 Kotlin의 기본 개념에 대해 배웠습니다. 유형 변환은 데이터 변수의 한 유형을 다른 데이터...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.