【问题标题】:getView of Child Fragment returns null子片段的getView返回null
【发布时间】:2013-11-19 13:33:43
【问题描述】:

我正在创建和替换另一个片段 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 始终为空,因此它们都不起作用。

当我删除由于 listView 引起的所有这些空指针异常时,searchFragment 功能也可以正常工作。 我也尝试过覆盖 searchFragment 的 getView 并返回在 onCreateView 期间出错的视图的引用,但它也返回了 null。

编辑 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;
    }


}

【问题讨论】:

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


    【解决方案1】:

    子片段的getView返回null

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

    但是,有些事情告诉我你以错误的方式处理这个问题,你应该让 SearchFragmentListView 上设置自己的侦听器,并通过 getParentFragment() 方法将任何事件传递给父片段。

    【讨论】:

    • getChildFragmentManager().executePendingTransactions() 对我不起作用..我想在父片段中设置它,因为我在很多地方都使用搜索片段,并不是所有的地方都需要 onItemClicklistener 并且实现会有所不同在我用过的地方。
    • @thunderbird 通过 setter 方法将OnItemCLickListener 传递给searchFragment 实例,并将其存储在私有字段中。然后在SearchFragment(如onViewCreated())的生命周期之一中查看该字段是否为null,如果不为空,则将其分配给ListView
    • 太棒了伙计……终于奏效了……但每次都能奏效吗?我在创建片段对象并将其存储在引用中后立即设置onItemClickListener .. 是否仅在父项结束后才调用子项的 onViewCreated?
    • @thunderbird 子事务将在稍后的时间点完成,因此父事务的 onViewCreated() 将首先运行。如果您需要额外检查,在该设置器中还要检查 listView 引用是否为空(如果它不为空,则表示 SearchFragment 的视图可用)。如果引用不为空,则还要在同一个 setter 中设置 OnItemCLickListener
    • 请用评论更新您的答案,以便我接受它作为答案。
    猜你喜欢
    • 2014-04-30
    • 1970-01-01
    • 2013-10-07
    • 1970-01-01
    • 2012-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多