我正在创建并替换其他片段onViewCreated
中的片段public void onViewCreated(View view, Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onViewCreated(view, savedInstanceState);
//add searchFragment to this fragment
FragmentTransaction fragmentTransaction = getChildFragmentManager().beginTransaction();
if(searchFragment==null)
searchFragment=new SearchFragment();
fragmentTransaction.replace(R.id.updateFragmentContainer, searchFragment).commit();
if(searchFragment.getView()==null){
Log.d("getView","of search view is null");//the control always reaches here
}
listView=(ListView)getActivity().findViewById(R.id.listView1);
if(listView!=null)
listView.setOnItemClickListener(onItemClickListener);//the control never reaches here
else
searchFragment.setUpdateItemClickListener(onItemClickListener);//this is a function in the saerchFragment class; there too the listview obtained by findViewbyId is null
}
现在是searchFragment中的listView,我希望在父片段中设置onItemClickListener。我已经尝试了很多方法,如上所示,但它们都不起作用,因为findViewById返回的listView始终为null。
当我删除由于listView引起的所有这些空指针异常时,searchFragment功能也正常工作。 我也试过覆盖searchFragment的getView并返回在onCreateView期间被隐藏的视图的引用,但它也返回null。
EDIT SearchFragment类
import android.content.ContentProviderClient;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.widget.SimpleCursorAdapter;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;
public class SearchFragment extends Fragment {
int rollNo;
Button searchButton=null;
EditText rollNoEditText=null;
ListView listView=null;
public SearchFragment() {
// TODO Auto-generated constructor stub
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// TODO Auto-generated method stub
return inflater.inflate(R.layout.fragment_search, null);
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
// TODO Auto-generated method stub
rollNoEditText=(EditText)getView().findViewById(R.id.rollNoEditText1);
searchButton=(Button)getView().findViewById(R.id.searchbutton1);
if(searchButton!=null)
searchButton.setOnClickListener(onClickListener);
else
Log.d("Search Button", "null");
listView=(ListView)getView().findViewById(R.id.listView1);
}
View.OnClickListener onClickListener=new View.OnClickListener() {
@SuppressWarnings("deprecation")
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
if(rollNoEditText.getText().length()>0){
try{
rollNo=Integer.parseInt(rollNoEditText.getText().toString());
if(rollNo>0){
listView.setAdapter(
new SimpleCursorAdapter(getActivity(), // Context.
R.layout.item_parent_student,
getStudentCurosr(),
new String[] { "name","rollno","class","marks" },
// Parallel array of which template objects to bind to those
// columns.
new int[] {R.id.nameTextView2,R.id.rollNoTextView2,R.id.classTextView2,R.id.marksTextView2 }
));
}
//displayStudentInfo(rollNo);
}catch(Exception e){
e.printStackTrace();
Toast.makeText(getActivity().getApplicationContext(), "Please type a valid integer value", Toast.LENGTH_SHORT).show();
}
}
}
};
private Cursor getStudentCurosr() {
// Run query
Uri uri = Uri.parse("content://com.example.students.provider.studentcontentprovider/student/"+rollNo);
Log.d("RollNO passed",""+rollNo);
ContentProviderClient contentProviderClient = getActivity().getContentResolver().acquireContentProviderClient(uri );
Cursor cur = null;
try {
cur = contentProviderClient.query(uri,null,null, null, null);
return cur;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return cur;
}
}
答案 0 :(得分:2)
Child Fragment的getView返回null
片段事务是异步的,因此您在该替换事务中使用的新SearchFragment
将不会提供其视图(将在onViewCreated()
方法完成后将来发生)。您可以将侦听器实例传递给新创建的SearchFragment
实例,并将其存储在私有字段中(在该setter中,您还可以检查并查看当时ListView
是否可用,如果是然后还设置传入的监听器)。然后在SearchFragment
的一个生命周期方法(例如onViewCreated()
)中检查OnItemClickListener
字段,如果它是null
,则将其设置在ListView
窗口小部件上。< / p>
然而,有些东西告诉我你正在以错误的方式接近它,你应该让SearchFragment
在ListView
上设置自己的监听器,并通过{{1}将任何事件传递给父片段方法。