Child Fragment的getView返回null

时间:2013-11-19 13:33:44

标签: java android android-listview android-fragments onitemclicklistener

我正在创建并替换其他片段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;
    }


}

1 个答案:

答案 0 :(得分:2)

  

Child Fragment的getView返回null

片段事务是异步的,因此您在该替换事务中使用的新SearchFragment将不会提供其视图(将在onViewCreated()方法完成后将来发生)。您可以将侦听器实例传递给新创建的SearchFragment实例,并将其存储在私有字段中(在该setter中,您还可以检查并查看当时ListView是否可用,如果是然后还设置传入的监听器)。然后在SearchFragment的一个生命周期方法(例如onViewCreated())中检查OnItemClickListener字段,如果它是null,则将其设置在ListView窗口小部件上。< / p>

然而,有些东西告诉我你正在以错误的方式接近它,你应该让SearchFragmentListView上设置自己的监听器,并通过{{1}将任何事件传递给父片段方法。