使用Fragment时,findViewById返回NULL

时间:2012-05-06 08:43:46

标签: android android-activity nullreferenceexception fragment

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

我想在main活动中访问我片段的控件,但'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 为空。

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

7 个答案:

答案 0 :(得分:19)

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

答案 1 :(得分:16)

您应该inflate onCreateView Fragment findViewById方法上的片段布局,然后您可以在Activity上使用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; } } 结果转换为LinearLayout。

{{1}}

答案 2 :(得分:5)

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

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

答案 3 :(得分:3)

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

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

在需要Edittext obj。

的事件中,在Fragment类中创建一个回调

答案 4 :(得分:2)

1)试试这个:

Eclipse菜单 - &gt;项目 - &gt;清洁...

<强>更新

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

3)

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

Fragment类可以通过多种方式实现各种结果。它是核心,它代表在较大的Activity中运行的特定操作或接口。片段与它所处的活动密切相关,不能与一个片段分开使用。尽管Fragment定义了自己的生命周期,但生命周期依赖于它的活动:如果活动停止,则其中的任何碎片都不能启动;当活动被破坏时,所有碎片都将被销毁。

研究this。你必须使用FragmentManager。

答案 5 :(得分:0)

如果你想在活动onCreate中使用findViewById,你可以简单地将所有重叠方法放在onActivityCreated上。

答案 6 :(得分: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);