آموزش های این وب سایت به صورت رایگان در دسترس است. اطلاعات بیشتر
بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]

مشکل در تغییر رنگ status bar

حمید زمانی  11 سال پیش  11 سال پیش
+2 0

سلام
می خواستم مثل خیلی از برنامه هایی که به سبک متریال دیزاین طراحی میشن ، برنامم رو طراحی کنم اما به یه مشکل خوردم اونم اینکه نمی تونم رنگ status bar رو عوض کنم این کد های من لطفا کمک کنید:

    - build.gradle
apply plugin: 'com.android.application'

android {
compileSdkVersion 22
buildToolsVersion "22.0.1"

defaultConfig {
applicationId "com.example.hamid.hamidz"
minSdkVersion 8
targetSdkVersion 21
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}

dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:22.0.0'
}

-----------------------------------------------

- mainActivity :
Toolbar toolbar = (Toolbar) findViewById(R.id.tool_bar);
setSupportActionBar(toolbar);

-----------------------------------------------

- tool_bar.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.Toolbar
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:background="@color/ColorPrimary"
android:elevation="2dp"
android:theme="@style/Base.ThemeOverlay.AppCompat.Dark"
xmlns:android="https://schemas.android.com/apk/res/android" />


-----------------------------------------------


- activity_main.xml
<RelativeLayout 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=".MainActivity">

<include
android:id="@+id/tool_bar"
layout="@layout/tool_bar"
android:layout_height="wrap_content"
android:layout_width="match_parent" />

</RelativeLayout>

-----------------------------------------------

- style.xml
<resources>

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="colorPrimary">@color/ColorPrimary</item>
<item name="colorPrimaryDark">@color/ColorPrimaryDark</item>
</style>

</resources>


0 0
روی چه ورژنی تست می کنید؟ (11 سال پیش)
0 0
روی جنی موشن استاد (11 سال پیش)
+2 0
خوب این قابلیت از ورژن 4.4 به بعد اضافه شده (11 سال پیش)
0 0
خوب با این وضعیت اگه من بخوام از این قابلیت استفاده کنم البته با پشتیبانی از نسخه های قدیمی اندروید ، چه کاری باید انجام بدم؟ (11 سال پیش)
0 0
توی ورژن های پائینتر که راهی نیست فقط برای همون ورژن هایی که گفتم به شکل پائین عمل کنید (11 سال پیش)
 برای این سوال 1 پاسخ وجود دارد.
پاسخ به سوال 
CodeMaster  11 سال پیش
+7 0

خوب همونجور که بالا گفتم این قابلیت توی ورژن 4.4 به بعد اضافه شده البته شیوه پیاده سازیش در 4.4 و 5 متفاوته روشی که شما رفتید در ورژن 5 جواب میده و توی ورژن 4.4 جواب نمیده و باید از این راه برید:

اول اینکه من گفتم که توی ورژن 4.4 به بالا جواب میده اما این به این معنی نیست که باید minSdkVersion رو بزارید روی 19 فقط کافیه که در پوشه values یک styles.xml جدید بزنید چون از اندروید استودیو استفاده میکنید یک سری option سمت چپ هست بین اونها یکی نوشته version اونو انتخاب کنید و در سمت راست عدد 19 رو بزنید. این به این معنی هستش که این style مختص ورژن 4.4 به بالا هستش و برای ورژن های پائینتر از همون فایل styles.xml پیش فرض استفاده کنه

خوب پس یک style جدید در فایل styles.xml ای که مختص api های بزرگتر از 19 می سازیم به این شکل

 <style name="Theme.Saoshyance" parent="Theme.AppCompat.NoActionBar">
<item name="android:windowTranslucentStatus">true</item>
<item name="android:windowTranslucentNavigation">true</item>
</style>

اسم Theme دلخواه هستش و هرچی دوست داشتید بگذارید. خوب تمومه همین الان هم شما به چیزی که می خواستید رسیدید اما یک مشکل هست. اندروید بصورت پیش فرض رنگ background اکتویتی رو زیرش میزاره و اگر از تولبار یا اکشن بار استفاده کنید نا فرم میشه پس باید توی layout اکتیویتی مورد نظر این کار رو انجام بدیم:

اول اینکه باید parent همه layout هامون Relative Layout باشه :

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/rootLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#404040"
tools:context=".MainActivity">

<LinearLayout
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:fitsSystemWindows="true"
android:clipToPadding="false" android:id="@+id/fatherLayout">
<include layout="@layout/action_bar"
android:layout_height="wrap_content"
android:layout_width="fill_parent"

<ListView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/lstContent" android:divider="@null"/>

</LinearLayout>
/*
<LinearLayout
android:id="@+id/statusBarBackgroundLinearLayout"
android:layout_width="match_parent"
android:orientation="horizontal"
android:layout_height="30dp"
android:background="#ffffff"
android:clickable="false"
android:focusable="false">
*/
</LinearLayout>
</RelativeLayout>

 

اون تکه ای که با /**/ مشخص کردم باید به layout تون اضافه کنید و بعد حالا باید بریم توی اکتویتی و این کد رو بهش اضافه کنیم:

  private LinearLayout statusBarBackgroundLinearLayout;

private void setStatusBarBackground(View rootView) {
getStatusBarLayout(rootView);
int statusBarHeight;
statusBarHeight = getStatusBarHeight();
setStatusBarLayoutHeight(statusBarHeight);
}

private void getStatusBarLayout(View rootView){
statusBarBackgroundLinearLayout = (LinearLayout) rootView.findViewById(R.id.statusBarBackgroundLinearLayout);
if (isPreKitkatDevice()) {
hideStatusBarLayout();
}
}

private int getStatusBarHeight() {
int statusBarHeight = 0;
int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resourceId > 0) {
statusBarHeight = getResources().getDimensionPixelSize(resourceId);
}
return statusBarHeight;
}

private boolean isPreKitkatDevice(){
return Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT;
}

private void hideStatusBarLayout(){
statusBarBackgroundLinearLayout.setVisibility(View.INVISIBLE);
}

private void setStatusBarLayoutHeight(int height){
RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) statusBarBackgroundLinearLayout.getLayoutParams();
layoutParams.height = height;
}

 و حالا این کد را در onCreate اکتویتی قرار می دیم:

 RelativeLayout rootLayout = (RelativeLayout) findViewById(R.id.rootLayout);
setStatusBarBackground(rootLayout);

و دیگه تمومه

خوب حالا توضیحات:

linearLayout ای که تعریف کردیم در واقع میاد زیر status bar قرار میگیره پس ما نیاز داریم که ارتفاع status bar رو محاسبه کنیم متد getStatusBarHeight برای همینه. بعدز اینکه اندازه اش رو گرفتیم توی متد setStatusBarHeight میایم اندازه اونو به اندازه status bar میزاریم. در نهایت RelativeLayout ای که دربرگیرنده بقیه کنترل ها ست رو به متد setStatusBarBackground میدیم تا در واقع لایه مون رو تا زیر status bar بکشه. همچنین متد isPreKitKat هم برای این هستش که چک کنه ببینه گوشی اصلا ورژنش بالای 4.4 هست یا نه اگر زیر 4.4 باشه که اصلا انجام اینکار بی فایده است پس اون linearLayout رو invisible میکنه

0 0
پس این کد و قابلیت فقط رو دستگاه های مجهز به اندروید 4.4 به بالا جواب میده و ورژن های پایین تر نمی تونن status bar رنگی داشته باشن؟ (11 سال پیش)
0 0
بله همینطوره، اگر دقت کنید هم توی کد متدی هست برای اینکه چک کنه ورژن اندروید گوشی بالاتر از کیت کت هست یا خیر اگر بود که کارش رو انجام میده در غیر اینصورت اون linearLayout رو Invisible میکنه. راستی یادم رفت بگم که رنگ پس زمینه linearlayout رو همون رنگی بزارید که اکشن بارتون داره (11 سال پیش)
0 0
یعنی امکاناتی مثل تولبار و... رو نمیشه واسه ورژن های زیر 4.4 استفاده کرد؟ (11 سال پیش)
0 0
چرا اینها مشکلی ندارند بلکه عوض کردن رنگ status bar توی ورژن های پائینتر از 4.4 وجود نداره (11 سال پیش)
0 0
دمت گرم ، یه پیغام خصوصی بهت دادم ممنون میشم پاسخ بدی (11 سال پیش)
0 0
چیزی دریافت نکردم! (11 سال پیش)
0 0
الان چک کن (11 سال پیش)
0 0
دوست عزیز من کد رو کپی کردم و به نتیجه هم رسیدم اما کد رو درک نکردم اگه امکانش هست یک مقدار رو توضیح بدین البته در صورت امکان ، تشکر (11 سال پیش)
0 0
توضیحات اضافه شد (11 سال پیش)
0 0
فقط می تونم تشکر کنم (11 سال پیش)

پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .