program tip

Android 자료 : 상태 표시 줄 색상이 변경되지 않습니다.

radiobox 2021. 1. 9. 09:42
반응형

Android 자료 : 상태 표시 줄 색상이 변경되지 않습니다.


머티리얼 디자인을 테스트하기 위해 간단한 앱을 개발 중입니다. 나는 사용 com.android.support:appcompat-v7:21.0.0하고 있으며 내 활동은 다음과 같습니다.

public class MyActivity extends ActionBarActivity {
   ...
}

레이아웃은 다음과 같이 정의됩니다.

<LinearLayout 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"
    tools:context=".MyActivity">

    <android.support.v7.widget.Toolbar
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="128dp"
        android:minHeight="?attr/actionBarSize"
        android:background="?attr/colorPrimaryDark"/>
</LinearLayout>

이제 재료 지침에 따라 테마를 정의했습니다.

<style name="AppTheme" parent="Theme.AppCompat.NoActionBar">
    <item name="colorPrimary">@color/colorPrimary500</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark700</item>
</style>

Android 5 이전 버전에서 상태 표시 줄 색상을 변경하고로 설정하고 colorPrimaryDark싶지만 방법을 찾을 수 없습니다. 나는 사용해 보았다 :

getWindow().setStatusBarColor(..)

하지만 setStatusBar 색상은 레벨 21부터 사용할 수 있습니다. colorPrimaryDark테마에서를 정의하고 appcompact를 사용하면 상태 표시 줄의 색상이 변경되지 않는 이유는 무엇입니까? 누구든지 도울 수 있습니까?


상태 표시 줄은 운영 체제가 소유 한 시스템 창입니다. 5.0 이전 Android 기기에서 애플리케이션은 색상을 변경할 수있는 권한이 없으므로 AppCompat 라이브러리가 이전 플랫폼 버전에 대해 지원할 수있는 것이 아닙니다. AppCompat가 할 수있는 최선의 방법 ActionBar은 응용 프로그램 내에서 및 기타 일반적인 UI 위젯의 색상 지정을 지원 하는 것입니다.


상태 표시 줄의 색상은 5.0 미만으로 지원되지 않지만 4.4에서는 해결 방법을 사용하여 더 어두운 색상을 얻을 수 있습니다.

상태 표시 줄을 반투명하게 만들기

<item name="android:windowTranslucentStatus">true</item>

그런 다음 앱 바에 AppCompat의 툴바를 사용하여 시스템 창에 맞는지 확인합니다.

<android.support.v7.widget.Toolbar
    android:id="@+id/toolbar"
    ...
    android:fitsSystemWindows="true"/>

툴바를 활동의 툴바로 설정해야합니다.

protected void onCreate(final Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    ...
    toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

도구 모음은 상태 표시 줄 아래로 확장되고 상태 표시 줄의 반투명으로 인해 더 어두운 보조 색상으로 보입니다. 원하는 색상이 아닌 경우이 조합을 사용하면 선택한 배경색을 표시하는 상태 표시 줄 아래에보기를 맞출 수 있습니다 (상태 표시 줄에서 여전히 더 어둡게 표시됨).

4.4로 인한 엣지 케이스 해결 방법이지만 이제 끝났습니다.


if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
    getWindow().setStatusBarColor(getResources().getColor(R.color.actionbar));
}

이 코드를 Activity의 onCreate메소드 에 넣으십시오 . 이것은 나를 도왔다.


다른 사람들도 언급했듯이 활동의 ​​onCreate ()에 다음을 추가하여 쉽게 해결할 수 있습니다.

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
        getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        getWindow().setStatusBarColor(ContextCompat.getColor(this, R.color.primary_dark));
    }

그러나 여기서 추가하고 싶은 중요한 점은 경우에 따라 위의 경우에도 상태 표시 줄 색상이 변경되지 않는다는 것입니다. 예를 들어 내비게이션 드로어에 MikePenz 라이브러리를 사용하는 경우 상태 표시 줄 색상을 암시 적으로 재정의하므로 작동하려면 다음을 수동으로 추가해야합니다.

.withStatusBarColorRes (R.color.status_bar_color)


AppCompat v7 : 21.0.0에서는 상태 표시 줄 색상 표시가 지원되지 않습니다.

로부터 안드로이드 개발자 블로그 게시물

이전 플랫폼에서 AppCompat는 가능한 경우 색상 테마를 에뮬레이트합니다. 현재 이것은 작업 표시 줄과 일부 위젯의 색상 지정으로 제한됩니다.

즉, AppCompat lib는 Lollipop 이상에서 상태 표시 줄에만 색상을 지정합니다.


AppCompatActivity로 전환하고 툴바에 25dp paddingTop을 추가하고 켭니다.

<item name="android:windowTranslucentStatus">true</item>

그런 다음 will 툴바가 상단으로 이동합니다.


이 솔루션은 Lollipop, Kitkat 및 일부 Lollipop 이전 장치 (삼성 및 소니)의 상태 표시 줄 색상을 설정합니다. SystemBarTintManager는 Kitkat으로 장치를 관리한다)

@Override
protected void onCreate( Bundle savedInstanceState ) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    hackStatusBarColor(this, R.color.primary_dark);
}

@SuppressLint("NewApi")
@SuppressWarnings("deprecation")
public static View hackStatusBarColor( final Activity act, final int colorResID ) {
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
        try {

            if (act.getWindow() != null) {

                final ViewGroup vg = (ViewGroup) act.getWindow().getDecorView();
                if (vg.getParent() == null && applyColoredStatusBar(act, colorResID)) {
                    final View statusBar = new View(act);

                    vg.post(new Runnable() {
                        @Override
                        public void run() {

                            int statusBarHeight = (int) Math.ceil(25 * vg.getContext().getResources().getDisplayMetrics().density);
                            statusBar.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, statusBarHeight));
                            statusBar.setBackgroundColor(act.getResources().getColor(colorResID));
                            statusBar.setId(13371337);
                            vg.addView(statusBar, 0);
                        }
                    });
                    return statusBar;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    else if (act.getWindow() != null) {
        act.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
        act.getWindow().setStatusBarColor(act.getResources().getColor(colorResID));
    }
    return null;
}

private static boolean applyColoredStatusBar( Activity act, int colorResID ) {
    final Window window = act.getWindow();
    final int flag;
    if (window != null) {
        View decor = window.getDecorView();
        if (decor != null) {
            flag = resolveTransparentStatusBarFlag(act);

            if (flag != 0) {
                decor.setSystemUiVisibility(flag);
                return true;
            }
            else if (Build.VERSION.SDK_INT == Build.VERSION_CODES.KITKAT) {
                act.findViewById(android.R.id.content).setFitsSystemWindows(false);
                setTranslucentStatus(window, true);
                final SystemBarTintManager tintManager = new SystemBarTintManager(act);
                tintManager.setStatusBarTintEnabled(true);
                tintManager.setStatusBarTintColor(colorResID);
            }
        }
    }
    return false;
}

public static int resolveTransparentStatusBarFlag( Context ctx ) {
    String[] libs = ctx.getPackageManager().getSystemSharedLibraryNames();
    String reflect = null;

    if (libs == null)
        return 0;

    final String SAMSUNG = "touchwiz";
    final String SONY = "com.sonyericsson.navigationbar";

    for (String lib : libs) {

        if (lib.equals(SAMSUNG)) {
            reflect = "SYSTEM_UI_FLAG_TRANSPARENT_BACKGROUND";
        }
        else if (lib.startsWith(SONY)) {
            reflect = "SYSTEM_UI_FLAG_TRANSPARENT";
        }
    }

    if (reflect == null)
        return 0;

    try {
        Field field = View.class.getField(reflect);
        if (field.getType() == Integer.TYPE) {
            return field.getInt(null);
        }
    } catch (Exception e) {
    }

    return 0;
}

@TargetApi(Build.VERSION_CODES.KITKAT)
public static void setTranslucentStatus( Window win, boolean on ) {
    WindowManager.LayoutParams winParams = win.getAttributes();
    final int bits = WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS;
    if (on) {
        winParams.flags |= bits;
    }
    else {
        winParams.flags &= ~bits;
    }
    win.setAttributes(winParams);
}

Theme.AppCompa t 스타일 부모 만들기

<style name="AppTheme" parent="Theme.AppCompat">
     <item name="android:colorPrimary">#005555</item>
     <item name="android:colorPrimaryDark">#003333</item>
</style>

그리고 넣어 getSupportActionBar().getThemedContext()에서 onCreate().

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my);
        getSupportActionBar().getThemedContext();
}

이것이 질문에 대한 답이 아니라는 것을 알고 있지만 머티리얼 디자인 (API 21+)을 사용하면 다음의 테마 선언에 styles.xml다음 줄을 추가하여 상태 표시 줄의 색상을 변경할 수 있습니다 .

<!-- MAIN THEME -->
<style name="AppTheme" parent="@android:style/Theme.Material.Light">
    <item name="android:actionBarStyle">@style/actionBarCustomization</item>
    <item name="android:spinnerDropDownItemStyle">@style/mySpinnerDropDownItemStyle</item>
    <item name="android:spinnerItemStyle">@style/mySpinnerItemStyle</item>
    <item name="android:colorButtonNormal">@color/myDarkBlue</item>
    <item name="android:statusBarColor">@color/black</item>
</style>

주목 android:statusBarColor우리가 그렇지 않으면 기본 사용, 색상을 정의 할 수있는 곳.

참조 URL : https://stackoverflow.com/questions/26496411/android-material-status-bar-color-wont-change

반응형