9. Текстовий редактор для Android

1. Створіть новий проект в Android Studio.

2. Видаліть всі елементи активного екрану та додайте один: MultiLine Text. Розтягніть його на весь екран.

3. Додайте до файлу strings.xml наступні рядки:

1
2
3
4
5
    <string name="action_open">Відкрити</string>
    <string name="action_save">Зберегти</string>
    <string name="action_settings">Налаштування</string>
    <string name="pref_openmode">Режим відкриття</string>
    <string name="pref_size">Розмір шрифта</string>

4. Редагуйте меню таки чином, щоб там з'явились наступні пункти: 

    - Відкрити

    - Зберегти

    - Налаштування

1
2
3
4
5
6
7
8
    <item android:id="@+id/action_open" android:title="@string/action_open"
        android:icon="@android:drawable/ic_menu_day"
        android:orderInCategory="100" app:showAsAction="never" />
    <item android:id="@+id/action_save" android:title="@string/action_save"
        android:icon="@android:drawable/ic_menu_save"
        android:orderInCategory="99" app:showAsAction="never" />
    <item android:id="@+id/action_settings" android:orderInCategory="100"
         android:title="@string/action_settings"/>

5. Перейдіть у режим перегляду файлів проекту, в папку app/src/main/res та створіть там папку xml. У цій папці створіть файл preferences.xml та наповніть його наступним вмістом:

1
2
3
4
5
6
7
8
9
10
11
12
13
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="<a href="http://schemas.android.com/apk/res/android"">http://schemas.android.com/apk/res/android"</a> >
    <CheckBoxPreference
        android:key="@string/pref_openmode"
        android:summary="Відкривати файл при запуску"
        android:title="Відкрити" />
    <EditTextPreference
        android:defaultValue="14"
        android:dialogTitle="Введіть розмір шрифта(12-36"
        android:key="@string/pref_size"
        android:summary="Встановлює новий розмір шрифта"
        android:title="Розмір шрифта" />
</PreferenceScreen>

6. Створіть нову активність наступним чином: ПКМ на App -> New -> Activity -> Settings Activity. В полі ім'я напишіть SettingsActivity. Напишіть наступний код:

1
2
3
4
5
6
7
8
9
public class SettingsActivity extends PreferenceActivity {
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // завантаження налаштувань з ресурсів
        addPreferencesFromResource(R.xml.preferences);
    }
}

7. Перейдіть в папку Manifiests та відкрийте AndroidManifiest.xml. Необхідно ініцілізувати нову активність. Для цього після останньої активності наберіть код:

1
2
3
4
        <activity
            android:name=".SettingsActivity"  // ім'я активності
            android:label="@string/title_activity_settings" > // назва на екрані
        </activity>

8. В MainActivity пишеться основний код. Необхідні методи для збереження, зчитування та виклику налаштувань. Ініціалізація змінних:

1
2
3
4
5
6
7
8
9
10
11
12
    public final static String FILENAME = "lab.txt"; // ім'я файлу
    public EditText mEditText; // змінна для текстового поля
 
    public static final String APP_PREFERENCES = "preferences"; // глобальна змінна файлу налаштуваня
    private SharedPreferences mSettings;  // самі налаштування
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        mEditText = (EditText)findViewById(R.id.editText); // пошук текстового поля
    }

Код зчитування:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
    private void openFile(String fileName) {   // сам метод
        try {
            InputStream inputStream = openFileInput(fileName);  // створення потоку
 
            if (inputStream != null) {   // не = 0
                InputStreamReader isr = new InputStreamReader(inputStream);  // конструктор нового потоку зчитування
                BufferedReader reader = new BufferedReader(isr);   // буфер зчитування
                String line;   // змінна для тексту
                StringBuilder builder = new StringBuilder();
 
                while ((line = reader.readLine()) != null) {  // цикл з передумовою
                    builder.append(line + "\n");  // до кінця файла
                }
 
                inputStream.close();   // закриття потоку
                mEditText.setText(builder.toString());  // текст передається у текстове поле
            }
        } catch (Throwable t) {   // якщо помилка
            Toast.makeText(getApplicationContext(),   // повідомлення з допомогою Toast 
                    "Exception: " + t.toString(), Toast.LENGTH_LONG).show();
        }
    }

Код збереження:

1
2
3
4
5
6
7
8
9
10
11
   private void saveFile(String fileName) { // метод
        try {
            OutputStream outputStream = openFileOutput(fileName, 0);  // поток запису
            OutputStreamWriter osw = new OutputStreamWriter(outputStream);  // створення нового запису
            osw.write(mEditText.getText().toString()); // запис тексту з поля
            osw.close(); // закриття потоку
        } catch (Throwable t) { //  повідомлення про помилку
            Toast.makeText(getApplicationContext(),
                    "Exception: " + t.toString(), Toast.LENGTH_LONG).show();
        }
    }

Код для обробки вибору пунктів меню:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
            switch (id) {
                case R.id.action_open:
                    openFile(FILENAME);
                    return true;
                case R.id.action_save:
                    saveFile(FILENAME);
                    return true;
                case R.id.action_settings:
                    Intent intent = new Intent();
                    intent.setClass(this, SettingsActivity.class);
                    startActivity(intent);
                    return true;
                default:
                    return true;
            }

Код для події OnResume:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
   public void onResume() {// метод Resume
        super.onResume(); // працює тоді, коли активність знову включена
        SharedPreferences prefs = PreferenceManager
                .getDefaultSharedPreferences(this);
        // зчитування значень із налаштувань
        if (prefs.getBoolean(getString(R.string.pref_openmode), false)) {
            openFile(FILENAME);
        }
        // зчитування розміру шрифта
        float fSize = Float.parseFloat(prefs.getString(
                getString(R.string.pref_size), "20"));
        // зміна налаштувань текстового поля
        mEditText.setTextSize(fSize);
    }

9. Запустіть та подивіться на результати: перед вами звичайний блокнот написаний на Java, який може зберігати та зчитувати текст з файлу, а також змінювати налаштування розміру тексту:

Контрольні питання:

1. Що містить файл strings.xml?

2. Які команди java на android відовідають за роботу з файлами?

3. Як ініціалізувати глобальні статичні змінні і нові активності?

4. За що відповідає подія OnResume?

5. Що містить клас Toast? Для чого він?