Освой программирование играючи
/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000
В статье, посвященной применению ресурсов в программах, я вскользь упомянул о возможности использовать системные ресурсы Android. Рассмотрим эту тему поближе на примере графических системных ресурсов и напишем отдельное приложение.
Для начала нужно отметить, что описание графических системных ресурсов можно найти на
Мы можем использовать системное изображение в своих целях, например, в примере создания текстового редактора для получения изображения дискеты к пункту меню "Сохранить" я использовал конструкцию:
menu.add(Menu.NONE, IDM_SAVE, Menu.NONE, "Сохранить")
.setIcon(android.R.drawable.ic_menu_save);
Android содержит множество подобных изображений. Зная их названия и константы, мы можем написать приложение, которое будет выводить все имеющиеся системные графические ресурсы на экран. Создадим новый проект. Добавим список.
<?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>
Добавим ещё один 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 для своих нужд.
Несмотря на кажущееся удобство использования встроенных системных ресурсов, данный способ не рекомендован компанией Google. Свою позицию они объясняют тем, что нет никаких гарантий, что в новых версиях Android останутся те же изображения, а также сохранятся их константы. В самом деле, в новых версиях происходят небольшие изменения и в словах Google есть небольшой резон.
Но, что делать разработчику, если очень хочется использовать системную графику в своих приложениях для придания профессионального вида? Выход есть! Купите моему коту полкило колбасы, и я открою вам тайну. Пока вы собираете деньги на покупку, я продолжу свой рассказ.
Если вы устанавливали Android SDK (а вы наверняка его устанавливали), то самое время найти ее папку. Далее перейдите в какую-нибудь папку типа platforms\android-НомерВерсии\data\res\drawable-hdpi. Например, на моем компьютере под Windows 8 путь выглядит как D:\Android\SDK\platforms\android-23\data\res\drawable-hdpi. В этой и других схожих папках вы найдете все необходимые вам системные изображения. Скопируйте нужно вам изображение в свой проект в качестве собственных ресурсов и пользуйтесь на здоровье.
Рефлексия всегда считалась нежелательной из-за потребления ресурсов. Только для общего развития.
Создадим разметку.
<?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");
}
}
}