我有一个片段"数据"从主活动类接收字符串数组并将这些字符串设置为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
请帮助。
答案 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]);
}
}
您无需在片段中对布局进行两次充气。