29

我是 Android 开发的新手,当然也是 Fragments 的新手。

我想在主要活动中访问我的片段的控件,但“findViewById”返回 null。没有片段代码可以正常工作。

这是我的代码的一部分:

片段:_

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    tools:ignore="HardcodedText" >

    <EditText
        android:id="@+id/txtXML"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:ems="10"
        android:scrollbars="vertical">
    </EditText>

</LinearLayout>

MainActivity 的 onCreate :

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        super.setContentView(R.layout.main);

        this.initialisePaging();

        EditText txtXML = (EditText) findViewById(R.id.txtXML);}

在这一点上,txtXML为空。

我的代码中缺少什么或者我应该怎么做?

4

7 回答 7

21

在 onCreateView 上的片段上尝试这样

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    if (container == null) {
        return null;
    }

    LinearLayout ll = (LinearLayout )inflater.inflate(R.layout.tab_frag1_layout, container, false);
EditText txtXML = (EditText) ll.findViewById(R.id.txtXML);

    return ll;
}
于 2012-10-24T12:46:07.137 回答
18

您应该在方法上inflate设置片段的布局,然后您可以简单地使用.onCreateViewFragmentfindViewByIdActivity

在此示例中,我的片段布局是一个 LinearLayout,因此我将inflate结果转换为 LinearLayout。

    public class FrgResults extends Fragment 
    {
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
        {
            //some code
            LinearLayout ll = (LinearLayout)inflater.inflate(R.layout.frg_result, container, false);
            //some code
            return ll;
        }
    }
于 2012-05-07T07:41:00.603 回答
6

我迟到了,但对于其他有这个问题的人。您应该在 onCreateView 方法中膨胀您的视图。然后覆盖该onCreateActivity方法,您可以getView().findViewById在那里使用。

@Override public View onCreateView(LayoutInflater inflater, ViewGroup     container, Bundle savedInstanceState) 
{
     return      inflater.inflate(R.layout.fragment, container, false);
}
于 2012-06-17T18:10:32.593 回答
3

您无法访问活动类中片段的视图,findViewById而是您可以做的是......

您的活动文件中必须有一个 Fragment 类的对象,对吧?在该片段类中创建 EditText 类的 getter 方法并在您的活动中访问该方法。

在需要 Edittext obj 的事件上在 Fragment 类中创建回调。

于 2012-05-06T11:00:37.867 回答
2

1)试试这个:

Eclipse 菜单 -> 项目 -> 清理...

更新

2) 如果您有 2 个或更多“主”布局实例,请检查它们是否都有一个带有“txtXML”ID 的视图

3)

片段是可以放置在活动中的应用程序用户界面或行为的一部分。与fragment的交互是通过FragmentManager完成的,可以通过Activity.getFragmentManager()和Fragment.getFragmentManager()获得。

Fragment 类可以通过多种方式获得多种结果。它是核心,它代表了在更大的 Activity 中运行的特定操作或接口。Fragment 与其所在的 Activity 密切相关,不能单独使用。尽管 Fragment 定义了自己的生命周期,但该生命周期取决于其活动:如果活动停止,则无法启动其中的任何片段;当activity被销毁时,所有的fragment都会被销毁。

研究这个。您必须使用 FragmentManager。

于 2012-05-06T09:46:30.057 回答
0

如果您想像在活动 onCreate 中一样使用 findViewById,您可以简单地将所有内容放入覆盖的方法 onActivityCreated 中。

于 2013-03-09T18:33:18.713 回答
0

上面的所有答案都告诉您应该如何“返回布局”,但没有确切告诉您如何引用返回的布局,因此我无法使用任何给出的解决方案。我使用了不同的方法来解决问题。在处理片段的 Fragment 类中,进入onViewCreated()该类并在其中创建一个上下文变量,以保存父活动(在我的情况下为主要活动)的上下文。

public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    Context fragmentContext = (MainActivity) view.getContext();
}

完成后,您可以使用新上下文从onViewCreated()方法内部访问片段上的项目。

EditText editText = context.findViewById(R.id.textXML);
于 2020-08-13T05:54:31.923 回答