Я работаю над созданием приложения для Android 3 с навигацией на основе вкладок. Будучи совершенно новым для Android, я искал учебники для вкладок и нашел несколько разных подходов, из которых реализация, основанная на Fragments + ActionBar, казалась лучшей. Я следовал этим урокам
http://www.abelski.com/courses/android3ui/actionbar.pdf (последние несколько слайдов) и
http://www.youtube.com/watch?v=gMu8XhxUBl8 (тот же урок в видеоформате)
... и, дойдя до точки, где отображаются вкладки, я могу переключаться между ними, и простые TextViews внутри них отображаются нормально.
Теперь возникают проблемы, когда я хочу, чтобы на одной из вкладок был виджет счетчика, определенный в XML-файле фрагмента, и он был заполнен элементами, определенными в файле strings.xml. Когда я пытаюсь получить доступ к счетчику с помощью getViewById () из метода onCreate () , я всегда получаю нулевое значение в результате.
Насколько я понимаю, чтобы это исправить, мне нужно как-то объявить XML-фрагмент (аналогично тому, как основной макет был сделан с setContentView (R.layout.main) ), чтобы getViewById () знает, где искать счетчик (хотя автозаполнение Eclipse находит его уже). Однако я совершенно не знаю, как это сделать, поскольку ни одно из руководств не рассматривало сценарий, в котором вы хотите изменить содержимое фрагментов на основе XML внутри кода.
Файл main.xml выглядит следующим образом:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<LinearLayout android:layout_height="wrap_content"
android:layout_width="match_parent"
android:id="@+id/fragment_placeholder"></LinearLayout>
</LinearLayout>
tab1_fragment.xml вот так:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<Spinner android:id="@+id/spinner1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
и метод onCreate, подобный этому:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ActionBar ab = getActionBar();
ab.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
ActionBar.Tab newAuditTab = ab.newTab().setText(R.string.tabheader_new_audit);
Fragment newAuditFrag = new FragmentTabNewAudit();
newAuditTab.setTabListener(new TabListener(newAuditFrag));
ab.addTab(newAuditTab);
//and the same for other tabs
Spinner spinner = (Spinner) findViewById(R.id.spinner1); // this returns null
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(
this, R.array.cell_array, android.R.layout.simple_spinner_item); //cell_array is defined in strings.xml
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(adapter);
spinner.setOnItemSelectedListener(new MyOnItemSelectedListener());
}
Доступ к представлениям, которые определены в main.xml через R.id, работает нормально, поэтому в этом случае проблема не связана с автоматическим импортом Eclipse класса R, я думаю.
Полагаю, я мог бы программно определить счетчик, чтобы обойти проблему, но, надеюсь, есть более элегантное решение этого вопроса. Я не могу видеть картинку Android достаточно хорошо, чтобы понять, где ее искать.