Изменения стиля приложения: Часть 1

Сегодня на уроке мы начнем работать со стилями и темами приложения. Для того чтобы изменить стиль приложения мы идем в “res/values/styles.xml” (учтите что мы делаем изменения в файле “styles.xml” а не в “styles.xml v21“). У нас есть основная тема (стиль) которая называется “AppTheme“, данная тема содержит всего лишь три атрибута которые отвечают за цвет различных элементов. Для того что бы изменить стиль приложения мы можем добавить кучу атрибутов но пока добавим только один для того что бы убрать верхнюю панель (Status Bar). Ниже находится атрибут который отвечает за то чтобы экран был без верхней панели.

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

Таким образом весь стиль “AppThem” у нас должен выглядеть так:

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">

<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
<item name="android:windowFullscreen">true</item>

</style>

Теперь если мы запустим приложение то увидим что экран “полный” без “Status Bar” панели. Данная тема прикрепляется ко всему приложению в файле “AndroidManifest.xml“. Если мы впишем данную тему только для одного Activity то тема будет действовать только на это Activity, но так как данная тема вписана в Aplication  то эта тема влияет на все Activity  нашего приложения. Советую открыть файл “AndroidManifest.xml” и посмотреть где вписана наша тема “AppTheme“.

AndroidManifest.xml:

 <?xml version=”1.0″ encoding=”utf-8″?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.neco_desarrollo.fisher_hanbook">
<uses-permission android:name="android.permission.INTERNET" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity
android:name=".Logo_Activity"
android:label="@string/app_name"
android:theme="@style/AppTheme.NoActionBar">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".Text_Content_Activity" />
<activity android:name=".MainActivity" android:theme="@style/AppTheme.NoActionBar"/>

</application>

</manifest>

Автоматический переход на главный экран.

В одном из видео мы сделали экран с логотипом и кнопку для перехода на главный экран, на этом уроке мы сделаем чтобы когда пользователь открывал наше приложение появлялся экран с логотипом и через несколько секунд открывался основной экран автоматически без нажатия кнопки. Для начала давайте вспомним какой код мы используем для перехода на главный экран:

Intent i = new Intent(Logo_Activity.this,MainActivity.class);
startActivity(i);

Данный код мы используем при нажатии на кнопку, но теперь мы хотим чтобы он запускался автоматически через несколько секунд после открытия приложения. Давайте вспомним какая функция запускается при открытии приложения? Для этого нам нужно вспомнить урок про цикл жизни Activity . Когда Activity создается то запускается функция onCreate() в ней как раз мы и могли бы написать код для перехода на следующий экран (Главный экран), но есть одна проблема!! Дело в том что если мы напишем код для открытия главного Activity без дополнительного кода то главное Activity откроется практически мгновенно после открытия приложения и мы практически не увидим наш экран с логотипом. Значит нам нужно каким то образом сделать паузу в несколько секунд после открытия экрана с логотипом. В приложении “Светофор” мы уже научились “усыплять” поток. с помощью команды Thread.sleep(); . Но я уже говорил что “усыплять” основной поток это не очень хорошо!! В приложении “Светофор” для того что бы не “усыплять” основной поток мы создали новый поток для запуска кода, новый поток мы можем “усыпить” без всяких проблем! И так давайте вспомним как создается новый поток:

new Thread(new Runnable() {
    @Override
    public void run() {

 

}
}).start();

Внутри функции “public void run(){}” мы и будем писать код для “усыпления” потока и для перехода на главный экран, у нас должно получится вот так:

new Thread(new Runnable() {
    @Override
    public void run() {
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        Intent i = new Intent(Logo_Activity.this,MainActivity.class);
        startActivity(i);
    }
}).start();

То есть мы запускаем новый поток, после “усыпляем” новый поток на 2 секунды и после запускаем главный экран, вот и все. Мы могли бы вписать весь этот код сразу в функцию onCreate() но лучше учится писать более “чистый” код и не “захламлять” по этому мы поместим данный код в нашу собственную функцию и в функции onCreate() запустим уже нашу функцию (это уже будет всего одна строчка). И так помещаем данный код в нашу новую функцию, например назовем ее startMainActivity():

 private void startMainActivity()
    {

    }

И вписываем код внутри новой функции, у нас должно получится так:

 private void startMainActivity()
    {
new Thread(new Runnable() {
    @Override
    public void run() {
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        Intent i = new Intent(Logo_Activity.this,MainActivity.class);
        startActivity(i);
    }
}).start();

    }

Ну вот и все, теперь чтобы использовать данную функцию мы просто используем название функции startMainActivity(); . Нам остается вписать данную функцию внутри функции onCreate() и готово:

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

init();
startMainActivity();


}