【问题标题】:Using Fragment layour ..... findbyViewId always NULL使用片段布局..... findViewbyId 始终为 NULL
【发布时间】:2014-01-28 00:21:31
【问题描述】:

我是 android 开发的新手,我正在努力让工作成为一个简单的例子。

当布局包含片段时,这个片段被膨胀并且方法 findByViewId 返回一个 NULL 指针。我想知道如何避免这种情况。

activity_main.xml 

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.todoit.MainActivity"
    tools:ignore="MergeRootFrame" />

到目前为止,我发现的唯一解决方案是不使用片段布局:/

fragment_main.xml 
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin"
    tools:context="com.example.todoit.MainActivity$PlaceholderFragment">

    <EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/myEditText"
        android:layout_alignParentTop="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true" />

    <ListView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/myListView"
        android:layout_below="@+id/myEditText"
        android:layout_alignRight="@+id/myEditText"
        android:footerDividersEnabled="false" /> </RelativeLayout>

这段代码返回了一个空指针

setContentView(R.layout.activity_main);列表视图我的列表视图 = (ListView)findViewById(R.id.myListView);

我发现的唯一方法是改用这个。

setContentView(R.layout.fragment_main);列表视图我的列表视图 = (ListView)findViewById(R.id.myListView);

所有这些代码都在 onCreate 方法中。

谁能告诉我如何解决这个问题?有没有办法让包括片段在内的整个布局膨胀?

非常感谢。 何塞

【问题讨论】:

    标签: android layout fragment findviewbyid


    【解决方案1】:

    您应该只在片段代码中扩充片段的视图,而不是在活动代码中。您使用onCreateView 方法来执行此操作。

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.fragment_main, container, false);
        ListView myListView= (ListView) v.findViewById(R.id.myListView);
        return v;
    }
    

    如果你想在onCreateView已经被调用后找到你的ListView,你可以使用getView()方法:

    ListView myListView= (ListView) getView().findViewById(R.id.myListView);
    

    【讨论】:

    • 工作,非常感谢。但是在我得到 Id 后我现在需要使用的其他一些代码在该方法中不起作用。 aa = new ArrayAdapter(this,android.R.layout.simple_list_item_1,todoItems);它说它找不到构造函数...之前在活动中找到 onCreate 没有问题。 :?
    • this 更改为 getActivity()Fragment 不继承自 Context
    • 之前在活动内部的 onCreate 方法中工作的代码,在 onCreateView 方法内部根本不做任何事情。基本上我尝试: ListView myListView= (ListView)rootView.findViewById(R.id.myListView); final EditText myEditText =(EditText) rootView.findViewById(R.id.myEditText); .... myListView.setAdapter(aa); myEditText.setOnKeyListener(new View.OnKeyListener() { public boolean onKey(.....)} );返回根视图; }
    • 基本上我只想获取列表的ID和编辑文本并捕获击键以将新项目添加到列表视图。这是 ToDoList 应用程序的一个非常简单的示例......但是我无法使用片段。
    • @user1564193 我认为如果您发布一个带有更新答案的新问题会更好。 Stack Overflow 应该有一个关于一个主题的问题和相关的答案。
    【解决方案2】:

    ListView myListView= (ListView) fragment.getView().findViewById(R.id.myListView);需要从片段类代码内部而不是主要活动中调用。在方法onActivityCreated里面调用,到时候fragment的onCreateView函数就成功了

    【讨论】:

    • 这行不通,因为 Fragment 类上没有 findViewById() 方法。
    • 没错,但你的回答没有提到getView()。请添加它,我将删除downvote。
    猜你喜欢
    • 2018-10-22
    • 2014-02-21
    • 2013-03-20
    • 1970-01-01
    • 2014-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多