Программный доступ к представлению, определенному в XML фрагмента в Android

Я в процессе создания приложения для Android 3, которое имеет навигацию на основе вкладок. Будучи совершенно новым для Android, я искал учебники по вкладкам и нашел несколько разных подходов, из которых реализация на основе фрагментов + ActionBar казалась лучшей. Я следил за этими учебниками

http://www.abelski.com/courses/android3ui/actionbar.pdf (последние несколько слайдов) и http://www.youtube.com/watch?v=gMu8XhxUBl8 (тот же урок в видео формат)

...и дошел до того, что вкладки появляются, я могу переключаться между ними нормально, и простые TextViews внутри них отображаются нормально.

Теперь проблемы возникают, когда я хочу, чтобы одна из вкладок имела виджет spinner, который определен в XML-файле фрагмента и заполнял его элементами, определенными в строках.XML-файл. Когда я пытаюсь получить доступ к spinner с getViewById () С onCreate () метод я всегда получаю нулевое значение как результат.

как я понимаю, чтобы исправить это, мне нужно как-то объявить XML фрагмента (аналогично, как основной макет был сделан с setContentView (R. макет.main)) так что getViewById () знает, где искать счетчик (автозаполнение Eclipse уже находит его). Тем не менее, я в полной растерянности, как это сделать, поскольку ни один из учебников не занимался сценарием, в котором вы хотите изменить содержимое XML-фрагментов внутри код.

главная.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 достаточно хорошо, чтобы знать, где искать.

1 ответов


как прядильщик не является ребенком , findViewById не могу найти его. Поскольку счетчик является дочерним элементом фрагмента, вы можете попробовать:

Spinner spinner = (Spinner)newAuditFrag.getView().findViewById(R.id.spinner1);

однако я не уверен, когда создается представление для фрагмента, поэтому getView() может также возвращать null, что эта точка в вашем коде. Затем вы можете попытаться переместить код в onResume, который вызывается после onCreate.