Вопрос по android – Android: каким образом я должен отделить код от стиля?
Начиная программирование на Android, начиная с html / php / css, я искал в Интернете простой способ отделить мой код от моего стиля - сейчас мне нужно отображать данные из базы данных в виде списка или таблицы.
Проще говоря, я получаю курсор из базы данных, перебираю его, создавая каждый элемент списка динамически в коде как TextViews. Затем я хотел бы применить стиль из внешнего файла макета XML для каждого элемента.
Pseudo-code:
style.xml:
// mystyle: жирный, 12pt
// ваш стиль: курсив, 11pt
Activity:
<code>for (each cursor-entry) { tv1 = new TextView(); applyStyle(tv, mystyle); tv2 = new TextView(); applyStyle(tv, yourstyle); //Apply content to textviews from the cursor... } mainLayout.setView(tv1); mainLayout.setView(tv2); </code>
Примеры кода, которые я нашел в сети, используют несколько строк кода или несколько файлов xml (с использованием inflate или cursorAdapters), и IMO быстро становится раздутым. Я просто хочу хороший аккуратный способ применить стиль к динамически создаваемому коду. Это возможно?
очень просто иметь XML-файл для строк. Единственное, что вам нужно, это файл XML и класс Adapter. Взгляните на этот простой пример:
Чтобы прочитать данные из базы данных, создайте вспомогательный класс, например:
public class MessagingDatabaseAdapter {
protected SQLiteDatabase database;
public MessagingDatabaseAdapter(Context context) {
MessagingDatabaseHelper databaseHelper = new MessagingDatabaseHelper(context, "message_history_db");
database = databaseHelper.getWritableDatabase();
}
public void close() {
database.close();
}
public void Entity[] getAllEntities() {
Entity[] values = null;
String query = "select * from TABLE_NAME";
Cursor cursor = null;
try {
cursor = database.rawQuery(query, null);
if( cursor.moveToFirst() ) {
int s = cursor.getCount();
values = new Entity[s];
do {
Entity entity = new Entity();
entity.setSomeProperty(cursor.getInt(cursor.getColumnIndex(SOME_PROPERTY_COLUMN)));
values[i++] = entity;
} while( cursor.moveToNext() );
}
} catch(Exception ex) {
} finally {
if( cursor != null ) {
cursor.close();
}
return values;
}
}
protected class MessagingDatabaseHelper extends SQLiteOpenHelper {
public MessagingDatabaseHelper(Context context, String name) {
super(context, name, null, 1);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("Your SQL to create Tables");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
}
В вашем классе деятельности:
MessagingDatabaseAdapter db = new MessagingDatabaseAdapter();
values = db.getAllEntities();
db.close();
list_view = (ListView) findViewById(R.id.list_view);
ListAdapter adapter = new ListAdapter(this, values);
list_view.setAdapter(adapter);
И класс ListAdapter:
public class ListAdapter extends ArrayAdapter<Entity> {
final Context context;
final Entity[] values;
public ListAdapter(Context context, Entity[] values) {
super(context, R.layout.list_screen, values);
this.values = values;
this.context = context;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View rowView = inflater.inflate(R.layout.list_view_item, parent, false);
TextView datetimeTextView = (TextView) rowView.findViewById(R.id.list_view_datetime_text_view);
datetimeTextView.setTypeface(someTypeFace);
return rowView;
}
}
И XML-файл макета строки (list_view_item.xml):
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
style="@style/BorderedFrame" >
<TextView
android:id="@+id/inbox_list_view_datetime_text_view"
style="@style/MediumText"
android:layout_width="wrap_content" >
</TextView>
</RelativeLayout>