6

我正在制作一个具有基于标签的导航的 Android 3 应用程序。作为 Android 新手,我搜索了选项卡教程并找到了一些不同的方法,其中基于 Fragments + ActionBar 的实现似乎是最好的。我按照这些教程

http://www.abelski.com/courses/android3ui/actionbar.pdf(最后几张幻灯片)和 http://www.youtube.com/watch?v=gMu8XhxUBl8(视频格式的相同课程)

...并且到了选项卡出现的地步,我可以在它们之间进行切换,并且它们内部的简单 TextViews 显示得很好。

现在,当我希望其中一个选项卡具有在片段的 XML 文件中定义的微调器小部件并使用 strings.xml 文件中定义的项目填充它时,就会出现问题。当我尝试从onCreate()方法中使用getViewById()访问微调器时,结果总是得到一个空值。

据我了解,要解决此问题,我需要以某种方式声明片段的 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());  
}

通过 R.id 访问 main.xml 中定义的视图可以正常工作,所以在这种情况下,我认为问题与 Eclipse 的 R 类的自动导入无关。

我想我可以以编程方式定义微调器来解决这个问题,但我希望可能有一个更优雅的解决方案。我不能很好地看到 Android 的大图,但我不知道该去哪里看。

4

1 回答 1

8

由于微调器本身不是子项ActivityfindViewById因此无法找到它。由于微调器是片段的孩子,您可以尝试:

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

但是,我不确定何时创建片段的视图,因此getView()也可能在代码中的该点返回 null。然后您可以尝试将代码移动到onResume之后调用onCreate

于 2011-09-29T13:53:35.077 回答