3

Я хочу сделать наложение экрана, который накладывает весь экран, включая панель состояния и панель навигации.Android - экран наложения, включая содержимое строки состояния

Я трачу несколько часов на поиски в Google/по-прежнему не повезло.

Это мой код:

MainActivity.java (пусковая):

package com.blogspot.diannaoxiaobai.myapplication; 

import android.content.Intent; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 

public class MainActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     startActivity(new Intent(this, Main2Activity.class)); 
    } 
} 

activity_main.xml:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/activity_main" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    tools:context="com.blogspot.diannaoxiaobai.myapplication.MainActivity"> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Hello World!" /> 
</RelativeLayout> 

Main2Activity.java (запуск по MainActivity):

package com.blogspot.diannaoxiaobai.myapplication; 

import android.app.Activity; 
import android.os.Bundle; 
import android.view.View; 
import android.view.Window; 

public class Main2Activity extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     //this.requestWindowFeature(Window.FEATURE_NO_TITLE); 
     //getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN); 
     setContentView(R.layout.activity_main2); 
    } 
} 

activity_main2.xml:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/activity_main2" 
    android:background="#99ed3636" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="horizontal" 
    tools:context="com.blogspot.diannaoxiaobai.myapplication.Main2Activity"> 
    <LinearLayout android:id="@+id/overlay_instruction" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:orientation="horizontal" 
     android:background="@android:color/transparent" 
     android:clickable="true"> 

    </LinearLayout> 
</LinearLayout> 

AndroidManifest.xml (только android:theme="@style/Theme.Transparent" добавил, остальные были сгенерированы автоматически):

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.blogspot.diannaoxiaobai.myapplication"> 

    <application 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:supportsRtl="true" 
     android:theme="@style/AppTheme"> 
     <activity android:name=".MainActivity"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
     <activity 
      android:name=".Main2Activity" 
      android:theme="@style/Theme.Transparent"></activity> 
    </application> 

</manifest> 

стилей. xml:

<resources> 
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> 
     <!-- Customize your theme here. --> 
     <item name="colorPrimary">@color/colorPrimary</item> 
     <item name="colorPrimaryDark">@color/colorPrimaryDark</item> 
     <item name="colorAccent">@color/colorAccent</item> 
    </style> 

    <style name="Theme.Transparent" parent="android:Theme.Holo.NoActionBar.Fullscreen"> 
     <item name="android:windowDrawsSystemBarBackgrounds">true</item> 
     <item name="colorPrimary">@android:color/transparent</item> 
     <item name="colorPrimaryDark">@android:color/transparent</item> 
     <item name="android:windowBackground">@android:color/transparent</item> 
     <item name="android:windowFullscreen">true</item> 
     <item name="android:backgroundDimEnabled">false</item> 
     <item name="android:windowContentOverlay">@null</item> 
     <item name="android:windowIsTranslucent">true</item> 
     <item name="android:windowTranslucentStatus">true</item> 
     <item name="android:windowTranslucentNavigation">true</item> 
    </style> 

</resources> 

Снимок экрана при запуске, он сделал успешный наложение всего экрана, включая как строку состояния, так и панель навигации, но содержимое строки состояния (например, часы, состояние батареи) исчезли:

enter image description here

Когда я оттеснен к освобождаемому Overlay активности, содержание строки состояния было вернуться:

enter image description here

То, что я хотел это наложить статус bar, не удаляя контент, как мне это сделать?

+1

я не уверен, но при установке 'windowFullScreen' в false, я получаю оверлей, не отталкивая содержимое строки состояния. Возможно, это решение, в противном случае вам придется делать [обходные пути] (http://stackoverflow.com/a/34061521/2668136) – Fllo

+0

Привет @ 林果 皞 Вы хотите наложить строку состояния, а также получить решение для action bar :) –

+0

@Fllo да, установите 'windowFullScreen' в false, зафиксировав это, вы спасли мою жизнь, спасибо огромное :) Вы можете подумать о том, чтобы положить это как ответ. –

ответ

1

Я попробовал это, так как вы пост и пришел с этим,

В Manifest.xml <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

public class MainActivity extends AppCompatActivity { 


    private WindowManager wm; 
    private ViewGroup mTopView; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 


     applyOverLay(); 


     mTopView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       //set your status bar visible Here 
       Toast.makeText(MainActivity.this, "Ding Ding ,I got a Click Removing overlay!!", Toast.LENGTH_SHORT).show(); 
       wm.removeViewImmediate(mTopView); 

      } 
     }); 

    } 


    public void applyOverLay() { 

     //set your status bar gone Here 
     final WindowManager.LayoutParams params = new WindowManager.LayoutParams(
       WindowManager.LayoutParams.FLAG_FULLSCREEN, 
       WindowManager.LayoutParams.FLAG_FULLSCREEN, 
       WindowManager.LayoutParams.TYPE_SYSTEM_ALERT, 
       WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN, 
       PixelFormat.TRANSLUCENT); 

     wm = (WindowManager) getApplicationContext().getSystemService(Context.WINDOW_SERVICE); 

     mTopView = (ViewGroup) getLayoutInflater().inflate(R.layout.inflator, null); 
     getWindow().setAttributes(params); 
     wm.addView(mTopView, params); 
    } 


} 

inflator.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingTop="25dp" 
    android:background="#56FF0000" 
    > 
</LinearLayout> 

Функция работает отлично, отрегулируйте его как ваши требования. Добавьте коды в View и Gone в барах состояния в местах, где ic ommented.

Edit: вам это не нужно, но, как вы сказали, что вы получаете нулевой указатель я добавить этот too.There не использовать его для вас, но только, чтобы избежать ошибок, Its вашей activity_main не мой. Теперь, если вы не можете исправить это, добавьте это как ваш activity_main.(Изменить его, как вы хотите)

activity_main.XML

<LinearLayout 
    android:id="@+id/lin" 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <View 
     android:background="#65000000" 
     android:id="@+id/view" 
     android:layout_width="match_parent" 
     android:layout_height="200dp" /> 

    <ImageView 
     android:background="#739" 
     android:layout_width="match_parent" 
     android:layout_height="200dp" /> 

    <ImageView 
     android:background="#789234" 
     android:layout_width="match_parent" 
     android:layout_height="200dp" /> 
</LinearLayout> 

Наслаждайтесь

выходы:

enter image description here enter image description here

+0

Я получил 'java.lang.RuntimeException: here' при запуске приложения. И я комментирую '// parentLinearLayout = (LinearLayout) findViewById (R.id.lin);' из-за R.id.lin не существует. –

+0

comeon в вашем основном действии добавьте линейный макет и установите id как lin –

+0

Я получаю 'Caused by: java.lang.NullPointerException: попытка вызвать виртуальный метод 'void android.view.View.setVisibility (int)' на нулевом объекте ссылка –