Fragment在布局inflater上提供null对象引用

时间:2015-08-11 17:20:54

标签: android

我有一个片段"数据"从主活动类接收字符串数组并将这些字符串设置为textview内部的类。
我有一个功能"设置"它接收字符串数组作为参数并将其设置为textview。
片段代码"数据"上课是 -

public class data extends Fragment {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View v=inflater.inflate(R.layout.data,container,false);
        return v;
    }

    public void set(String[] a){

        LayoutInflater li=(LayoutInflater)getActivity().getLayoutInflater() // Logcat gives error at this line 
        View v=li.inflate(R.layout.data,null);
        TextView t1=(TextView)v.findViewById(R.id.textView3);
        TextView t2=(TextView)v.findViewById(R.id.textView4);
        t1.setText(a[0]);
        t2.setText(a[1]);

    }
 }



Log cat错误是 -

java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.LayoutInflater android.app.Activity.getLayoutInflater()' on a null object reference



*****编辑******
现在我使用bundle而不是String array来传递数据 我的数据类看起来像这样 公共类数据扩展了Fragment {

TextView t1,t2;
    @Override

    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View v=inflater.inflate(R.layout.data,container,false);
         t1=(TextView)v.findViewById(R.id.textView3);
         t2=(TextView)v.findViewById(R.id.textView4);
        return v;
    }

    public void set(){


        t1.setText(getArguments().getString("name"));
        t2.setText(getArguments().getString("email"));

    }
}


我从我的主要活动中这样称呼这个集合

show.setOnClickListener(new OnClickListener(){ public void onClick(View v){
            FragmentTransaction ft=getFragmentManager().beginTransaction();
            data frag=new data();
            ft.add(R.id.ly2,frag);
            ft.commit();
            String s[]=data.show();
            Bundle b=new Bundle();
            b.putString("name",s[0]);
            b.putString("email",s[1]);
            frag.setArguments(b);
            frag.set();

        }});<br><br>

我的show函数在另一个使用数据库的类中 -

public String[] show(){
        String[] col={"name","email"};
        Cursor c=sdb.query("book",col,null,null,null,null,null);
        c.moveToFirst();
        String d[]=new String[2];
        d[0] =c.getString(c.getColumnIndex("name"));
        d[1] =c.getString(c.getColumnIndex("email"));
        return d;
        }


Logcat现在说 -

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference

请帮助。

2 个答案:

答案 0 :(得分:4)

在片段附加到活动之前,您正在调用set()

更新:在您编辑过的问题中,您仍然在片段附加到活动之前调用set()commit()上的FragmentTransaction是异步的;在将主应用程序线程的控制权返回给框架之后,才会开始将片段附加到活动上。

答案 1 :(得分:1)

public class data extends Fragment {
    TextView t1;
    TextView t2;
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View v=inflater.inflate(R.layout.data,container,false);
           t1=(TextView)v.findViewById(R.id.textView3);
        t2=(TextView)v.findViewById(R.id.textView4);
        return v;
    }

    public void set(String[] a){
        t1.setText(a[0]);
        t2.setText(a[1]);

    }
 }

您无需在片段中对布局进行两次充气。