Освой программирование играючи

Сайт Александра Климова

Шкодим

/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000

Системные графические ресурсы

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

Для начала нужно отметить, что описание графических системных ресурсов можно найти на официальной странице для разработчиков под Android. Там можно узнать названия ресурсов, а также их числовые значения (константы).

Мы можем использовать системное изображение в своих целях, например, в примере создания текстового редактора для получения изображения дискеты к пункту меню "Сохранить" я использовал конструкцию:


menu.add(Menu.NONE, IDM_SAVE, Menu.NONE, "Сохранить")
    .setIcon(android.R.drawable.ic_menu_save);

Android содержит множество подобных изображений. Зная их названия и константы, мы можем написать приложение, которое будет выводить все имеющиеся системные графические ресурсы на экран. Создадим новый проект. Добавим список.

res/layout/activity_main.xml


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:orientation="vertical">

    <ListView
        android:id="@id/android:list"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:drawSelectorOnTop="false"/>

    <TextView
        android:id="@id/android:empty"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="No data"/>
</LinearLayout>

res/layout/row.xml

Добавим ещё один xml-файл для разметки элемента списка:


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    android:id="@+id/vw1"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">

    <ImageView
        android:id="@+id/imageViewDrawableIcon"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <TextView
            android:id="@+id/textView1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textSize="12sp"
            android:textStyle="bold"/>

        <TextView
            android:id="@+id/textView2"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textSize="12sp"/>
    </LinearLayout>
</LinearLayout>

Теперь напишем сам код для основного класса приложения:


package ru.alexanderklimov.resourceexplorer;

import android.app.ListActivity;
import android.content.res.Resources;
import android.os.Bundle;
import android.widget.SimpleAdapter;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


public class MainActivity extends ListActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        // define the list which holds the information of the list
        List<Map<String, Object>> resourceNames =
                new ArrayList<>();

        // define the map which will hold the information for each row
        Map<String, Object> data;

        // hard coded numbers retrieved from
        // http://developer.android.com/intl/ru/reference/android/R.drawable.html
        for (int idx = 17301504; idx <= 17301655; idx++) {
            data = new HashMap<>();

            try {
                String stg = Resources.getSystem().getResourceName(idx);

                data.put("line1", stg);
                data.put("line2", idx);
                data.put("img", idx);
                resourceNames.add(data);
            } catch (Resources.NotFoundException nfe) {
                // ignore
            }
        }

        SimpleAdapter notes = new SimpleAdapter(
                this,
                resourceNames,
                R.layout.row,
                new String[]{"line1", "line2", "img"},
                new int[]{R.id.textView1, R.id.textView2, R.id.imageViewDrawableIcon});

        setListAdapter(notes);
    }
}

Запустив приложение, мы увидим прокручиваемый список с изображениями, которые используются системой Android для своих нужд.

Resource Explorer

Несмотря на кажущееся удобство использования встроенных системных ресурсов, данный способ не рекомендован компанией Google. Свою позицию они объясняют тем, что нет никаких гарантий, что в новых версиях Android останутся те же изображения, а также сохранятся их константы. В самом деле, в новых версиях происходят небольшие изменения и в словах Google есть небольшой резон.

Но, что делать разработчику, если очень хочется использовать системную графику в своих приложениях для придания профессионального вида? Выход есть! Купите моему коту полкило колбасы, и я открою вам тайну. Пока вы собираете деньги на покупку, я продолжу свой рассказ.

Если вы устанавливали Android SDK (а вы наверняка его устанавливали), то самое время найти ее папку. Далее перейдите в какую-нибудь папку типа platforms\android-НомерВерсии\data\res\drawable-hdpi. Например, на моем компьютере под Windows 8 путь выглядит как D:\Android\SDK\platforms\android-23\data\res\drawable-hdpi. В этой и других схожих папках вы найдете все необходимые вам системные изображения. Скопируйте нужно вам изображение в свой проект в качестве собственных ресурсов и пользуйтесь на здоровье.

Папка с картинками

Список drawable-ресурсов через рефлексию

Рефлексия всегда считалась нежелательной из-за потребления ресурсов. Только для общего развития.

Создадим разметку.


<?xml version="1.0" encoding="utf-8"?>
<ScrollView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/textViewInfo"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
</ScrollView>

Код.


package ru.alexanderklimov.as14;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.TextView;

import java.lang.reflect.Field;


public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        TextView infoTextView = (TextView) findViewById(R.id.textViewInfo);

        Field[] fieldDrawables = android.R.drawable.class.getFields();
        for (Field field : fieldDrawables) {
            infoTextView.append("R.drawable." + field.getName() + " :\n");
            infoTextView.append(field.toString() + "\n");

            try {
                int value = (int) field.get(fieldDrawables);
                infoTextView.append("value = " + value + "\n");
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
            infoTextView.append("\n");
        }
    }
}

Папка с картинками

RecyclerView + CardView example with ImageView - list available Drawable - аналогичный пример с новыми компонентами.

Реклама