你如何在片段中膨胀动态创建的对象?

Posted

技术标签:

【中文标题】你如何在片段中膨胀动态创建的对象?【英文标题】:How do you inflate dynamically created objects in a fragment? 【发布时间】:2014-10-06 16:11:56 【问题描述】:

我查看了大多数其他线程,但我无法弄清楚导致我的应用程序崩溃的原因。我不断收到“尝试在空引用对象上调用虚拟方法 android.view.View android.view.View.findViewById(int)。此错误发生在第 25 行或

"View ObjectView = inflater.inflate(R.layout.fragment_layout_biking,container,false); "

如何在 Android 中为新创建的对象扩展视图? 谢谢。

    public class Fragment1 extends Fragment 

        @Override
        public View onCreateView(LayoutInflater inflater,
                @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) 
            // TODO Auto-generated method stub
            View ObjectView = inflater.inflate(R.layout.fragment_layout_biking,   container, false);
            final EditText input1 = (EditText)getView().findViewById(R.id.input);
            final ScrollView scroll = (ScrollView)getView().findViewById(R.id.scrolling);
            Button addbox = (Button)getView().findViewById(R.id.CheckBoxAdd);
            addbox.setOnClickListener(new OnClickListener()

                @Override
                public void onClick(View arg0) 
                    for (int box = 0; box <25; box++)
                    CheckBox newcheckbox = (CheckBox)getView().findViewById(R.id.NewCheckBox);
                    newcheckbox.setText(input1.toString());
                    scroll.addView(newcheckbox);
                    
                
            );



            return ObjectView;
        

这里是xml

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_
        android:layout_
        android:id="@+id/linearlayout"
        android:orientation="vertical" >
       <EditText
        android:id="@+id/input"
        android:layout_
        android:layout_>
       </EditText>
       <Button
        android:id="@+id/CheckBoxAdd"
        android:layout_
        android:layout_
        android:text="Add Checkbox" />
       <ScrollView 
        android:id="@+id/scrolling"    
        android:layout_
        android:layout_ >
       <LinearLayout
        android:layout_
        android:layout_
        android:id="@+id/linearlayout2"
        android:orientation="vertical"> 
        </LinearLayout>

       </ScrollView>

    </LinearLayout>

【问题讨论】:

【参考方案1】:

getView 在返回 null 之前返回您在 onCreateView 中膨胀的视图。在您的代码中,您有两个选项,第一个是使用ObjectView.findViewById,来查找您需要的视图。后者是覆盖onViewCreated,使用第一个参数,也就是你在onCreateView返回的视图,来寻找你需要的视图

【讨论】:

【参考方案2】:

这是产生所需结果的最终代码。

package fragments_for_app;
import android.app.adventureprototype.R;
import android.content.Context;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.text.Layout;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.ScrollView;
public class Fragment1 extends Fragment 

    LinearLayout layout;
    CheckBox newcheckbox;
//18
    @Override
    public View onCreateView(LayoutInflater inflater,
            @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) 

        final View ObjectView = inflater.inflate(R.layout.fragment_layout_biking, container, false);
        final EditText input1 = (EditText)ObjectView.findViewById(R.id.input);
        layout = (LinearLayout)ObjectView.findViewById(R.id.linearlayout2);
          //final ScrollView scroll = (ScrollView)ObjectView.findViewById(R.id.scrolling);
        final Button addbox = (Button)ObjectView.findViewById(R.id.CheckBoxAdd);
        layout.removeAllViews();
        addbox.setOnClickListener(new OnClickListener()

            @Override
            public void onClick(View arg0) 


                    newcheckbox = new CheckBox(ObjectView.getContext());
                    newcheckbox.setText(input1.getText().toString());
                    layout.addView(newcheckbox);    


                    //work on this thursday


                
        );

          return ObjectView; 
    


【讨论】:

以上是关于你如何在片段中膨胀动态创建的对象?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法使用相同的布局动态创建片段并向它们显示数据?

为动态创建的 Android 片段提供自定义属性值

如何在循环中创建动态对象?

Android片段布局完成膨胀

片段对话框中的片段膨胀引发错误“片段未创建视图”

在android中动态创建选项卡并使用传入的参数加载片段