gpt4 book ai didi

android - 以编程方式访问在 Android 中 fragment 的 XML 中定义的 View

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:48:31 24 4
gpt4 key购买 nike

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

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

...到了显示选项卡的地步,我可以在它们之间切换 OK,并且它们内部的简单 TextView 显示正常。

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

据我了解,要解决此问题,我需要以某种方式声明 fragment 的 XML(类似于使用 setContentView(R.layout.main) 完成主布局),以便 getViewById() 知道在哪里寻找微调器(尽管 Eclipse 的自动完成功能已经找到它)。但是,我完全不知道如何执行此操作,因为没有任何教程解决您想要在代码中修改基于 XML 的 fragment 内容的场景。

ma​​in.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 中定义的 View 工作正常,所以在这种情况下,我认为问题与 Eclipse 自动导入 R 类无关。

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

最佳答案

由于微调器不是 Activity 本身的子项,因此 findViewById 无法找到它。由于微调器是 fragment 的子项,您可以尝试:

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

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

关于android - 以编程方式访问在 Android 中 fragment 的 XML 中定义的 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7597819/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com