findViewById 在使用 Fragment 时返回 NULL

findViewById returns NULL when using Fragment

提问人:mammadalius 提问时间:5/6/2012 最后编辑:waqaslammammadalius 更新时间:8/13/2020 访问量:53775

问:

我是 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 为 null。

我的代码中缺少什么,或者我该怎么办?

android-activity nullreferenceexception 片段

评论

0赞 blacharnia 5/6/2012
请发布您的initialisePaging()方法
0赞 mammadalius 5/6/2012
值得注意的是,仅将片段添加到 viewPager 中很重要this.initialisePaging();

答:

2赞 Bob 5/6/2012 #1

1)试试这个:

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

更新

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

3)

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

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

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

评论

0赞 Bob 5/6/2012
您是否只有一个“主”布局实例?
0赞 mammadalius 5/6/2012
是的,只有一个实例,我必须添加这个评论,它不在我的布局上,而是在我想在片段中使用的另一个布局上。txtXMLmain
0赞 mammadalius 5/6/2012
再次获取时,将返回。FragmentnullView myFragment = findViewById(R.layout.tab_frag2_layout);
3赞 Nixit Patel 5/6/2012 #2

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

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

在 Fragment 类中对需要 Edittext obj 的事件进行回调。

评论

0赞 mammadalius 5/6/2012
我为我的解决方案选择 Fragments 以降低它的复杂性并提高性能,但看起来它变得更加复杂。
0赞 Nixit Patel 5/6/2012
这并不复杂......它功能强大,可以为您提供更大的灵活性
18赞 mammadalius 5/7/2012 #3

您应该在方法上对片段进行布局,然后您可以简单地使用.inflateonCreateViewFragmentfindViewByIdActivity

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

    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;
        }
    }

评论

1赞 George Pligoropoulos 3/22/2014
此外,请确保如果您使用的是 Support v4 for Android,请使用并避免获得 .如果您仅针对较新版本的 Android API 进行构建,请使用常规和方法。不要混用这两种实现方式FragmentActivitygetSupportFragmentManagernullActivitygetSupportFragmentManager
6赞 gdi 6/18/2012 #4

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

@Override public View onCreateView(LayoutInflater inflater, ViewGroup     container, Bundle savedInstanceState) 
{
     return      inflater.inflate(R.layout.fragment, container, false);
}

评论

0赞 mammadalius 6/19/2012
你是对的。我的问题之前已经解决了。请展示一些其他人可以使用的充气片段。
0赞 gdi 6/20/2012
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment, container, false); }
0赞 mammadalius 6/20/2012
尊敬的@Futan请将您的评论写成一个单独的答案,并附上清晰的描述,以便对其他人有用,当然,我可以选择它作为接受的答案。
21赞 Ufuk Doganca 10/24/2012 #5

在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;
}

评论

0赞 mammadalius 10/24/2012
这在之前已经解决了。我寻找的是MainActivity上的txtXML,而不是Fragment本身。
0赞 Moesio 3/10/2013 #6

如果要像在活动 onCreate 中使用一样使用 findViewById,只需将所有内容放入重写的方法 onActivityCreated 中即可。

评论

0赞 hopeTo 5/17/2013
它在 onActivityCreated 方法中返回相同的 null。
0赞 Kenneth Murerwa 8/13/2020 #7

上面的所有答案都告诉您应该如何“返回布局”,但没有确切地告诉您如何引用返回的布局,因此我无法使用给出的任何解决方案。我用了不同的方法来解决这个问题。在处理片段的 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);