【问题标题】:can't findViewById inside AsyncTask在 AsyncTask 中找不到 ViewById
【发布时间】:2014-06-05 17:27:24
【问题描述】:

在 FragmentPagerAdapter 中的 SherlockListFragment 中的 ArrayAdapter costum listAdapter 中的 AsyncTask 中找不到 ViewById。 !!!

好的,场景如下:

我有一个这样的片段:

public class Fragment_Conversation_Section extends SherlockListFragment {

    View myFragmentView;

    public Fragment_Conversation_Section() {
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ListAdapter listAdapter = new Adapter_ConversationFragmentAdapter(getActivity(), R.layout.items_conversation,myFragmentView);
        setListAdapter(listAdapter);

    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {

        myFragmentView = inflater.inflate(R.layout.fragment_conversation, container, false);
        return myFragmentView;
    }


}

我创建了 myFragmentView 变量以将其传递给我的自定义 ListAdapter。

ListAdapter listAdapter = new Adapter_ConversationFragmentAdapter(getActivity(), R.layout.items_conversation,myFragmentView);

现在这是在我的自定义 ListAdapter 中

public class Adapter_ConversationFragmentAdapter extends ArrayAdapter<Array_Object_Chat_Interface> {

    Context context;
    int layoutResourceId;   
    int conversationsNo;
    List<Array_Object_Chat_Interface> conversationsItems;
    View rootView;

    public Adapter_ConversationFragmentAdapter(Context context, int layoutResourceId,View myView) {
        super(context, layoutResourceId);
        this.layoutResourceId = layoutResourceId;
        this.context = context;
        this.rootView = myView;
        this.conversationsNo = 0;

        conversationsItems = new ArrayList<Array_Object_Chat_Interface>();
        ArrayList<String> fName = new ArrayList<String>();

        AsyncTask<Void, Integer, String> getConversationsTask = new AsyncTask<Void, Integer, String>(){

            private ProgressBar pb;
            @Override
            protected String doInBackground(Void... params) {

              //doing some http request stuff in background
            }
            @Override
            protected void onPostExecute(String result)
            {
                Log.d("result.>>>", result);
            }


            @Override
            protected void onPreExecute() {

                pb = (ProgressBar) rootView.findViewById(R.id.progressbar2); // this is causing the error
            }


            @Override
            protected void onProgressUpdate(Integer... values) {
                pb.setProgress(values[0]);
            }

        };
        getConversationsTask.execute();



        for (int i = 0; i < conversationsNo; i++){
            Array_Object_Chat_Interface item = new Array_Object_Chat_Interface(fName.get(i));
            conversationsItems.add(item);

        }

    }


    /*private view holder class*/
    private class ViewHolder {
        TextView FName;
    }

    @Override
    public int getCount() {
        return this.conversationsNo;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder = null;
       // Check if an existing view is being reused, otherwise inflate the view
       if (convertView == null) {
           LayoutInflater inflater = ((Activity)context).getLayoutInflater();
           convertView = inflater.inflate(layoutResourceId, parent, false);

          holder = new ViewHolder();
          holder.FName = (TextView) convertView.findViewById(R.id.fName);

          convertView.setTag(holder);
       } else {
           holder = (ViewHolder) convertView.getTag();
       }

       Array_Object_Chat_Interface ChatInterface = conversationsItems.get(position);

       holder.FriendName.setText(ChatInterface.fName);

       return convertView;
   }
}

我将 myFragmentView 从片段传递到列表适配器,该适配器通过构造部分传递给新变量(myView),最终传递给变量“rootView”。 现在在 onPreExecute() 里面我想找到布局 R.layout.fragment_conversation 里面的进度条,它在片段的 onCreateView() 里面膨胀。

但在运行时它会崩溃并显示以下错误:

日志猫:

06-05 17:19:18.854: E/AndroidRuntime(324): FATAL EXCEPTION: main
06-05 17:19:18.854: E/AndroidRuntime(324): java.lang.NullPointerException
06-05 17:19:18.854: E/AndroidRuntime(324):  at com.example.android.Fragments.Adapter_ConversationFragmentAdapter$1.onPreExecute(Adapter_ConversationFragmentAdapter.java:146)
06-05 17:19:18.854: E/AndroidRuntime(324):  at android.os.AsyncTask.execute(AsyncTask.java:391)
06-05 17:19:18.854: E/AndroidRuntime(324):  at com.example.android.Fragments.Adapter_ConversationFragmentAdapter.<init>(Adapter_ConversationFragmentAdapter.java:156)
06-05 17:19:18.854: E/AndroidRuntime(324):  at com.example.android.Fragments.Fragment_Conversation_Section.onCreate(Fragment_Conversation_Section.java:26)
06-05 17:19:18.854: E/AndroidRuntime(324):  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:834)
06-05 17:19:18.854: E/AndroidRuntime(324):  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1080)
06-05 17:19:18.854: E/AndroidRuntime(324):  at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:622)
06-05 17:19:18.854: E/AndroidRuntime(324):  at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1416)
06-05 17:19:18.854: E/AndroidRuntime(324):  at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:431)
06-05 17:19:18.854: E/AndroidRuntime(324):  at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:139)
06-05 17:19:18.854: E/AndroidRuntime(324):  at android.support.v4.view.ViewPager.populate(ViewPager.java:804)
06-05 17:19:18.854: E/AndroidRuntime(324):  at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1016)
06-05 17:19:18.854: E/AndroidRuntime(324):  at android.view.View.measure(View.java:8313)
06-05 17:19:18.854: E/AndroidRuntime(324):  at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:581)
06-05 17:19:18.854: E/AndroidRuntime(324):  at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:365)
06-05 17:19:18.854: E/AndroidRuntime(324):  at android.view.View.measure(View.java:8313)
06-05 17:19:18.854: E/AndroidRuntime(324):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138)
06-05 17:19:18.854: E/AndroidRuntime(324):  at android.widget.FrameLayout.onMeasure(FrameLayout.java:250)
06-05 17:19:18.854: E/AndroidRuntime(324):  at android.view.View.measure(View.java:8313)
06-05 17:19:18.854: E/AndroidRuntime(324):  at android.widget.LinearLayout.measureVertical(LinearLayout.java:531)
06-05 17:19:18.854: E/AndroidRuntime(324):  at android.widget.LinearLayout.onMeasure(LinearLayout.java:309)
06-05 17:19:18.854: E/AndroidRuntime(324):  at android.view.View.measure(View.java:8313)
06-05 17:19:18.854: E/AndroidRuntime(324):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138)
06-05 17:19:18.854: E/AndroidRuntime(324):  at android.widget.FrameLayout.onMeasure(FrameLayout.java:250)
06-05 17:19:18.854: E/AndroidRuntime(324):  at android.view.View.measure(View.java:8313)
06-05 17:19:18.854: E/AndroidRuntime(324):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138)
06-05 17:19:18.854: E/AndroidRuntime(324):  at android.widget.FrameLayout.onMeasure(FrameLayout.java:250)
06-05 17:19:18.854: E/AndroidRuntime(324):  at android.view.View.measure(View.java:8313)
06-05 17:19:18.854: E/AndroidRuntime(324):  at android.view.ViewRoot.performTraversals(ViewRoot.java:839)
06-05 17:19:18.854: E/AndroidRuntime(324):  at android.view.ViewRoot.handleMessage(ViewRoot.java:1859)
06-05 17:19:18.854: E/AndroidRuntime(324):  at android.os.Handler.dispatchMessage(Handler.java:99)
06-05 17:19:18.854: E/AndroidRuntime(324):  at android.os.Looper.loop(Looper.java:123)
06-05 17:19:18.854: E/AndroidRuntime(324):  at android.app.ActivityThread.main(ActivityThread.java:3683)
06-05 17:19:18.854: E/AndroidRuntime(324):  at java.lang.reflect.Method.invokeNative(Native Method)
06-05 17:19:18.854: E/AndroidRuntime(324):  at java.lang.reflect.Method.invoke(Method.java:507)
06-05 17:19:18.854: E/AndroidRuntime(324):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
06-05 17:19:18.854: E/AndroidRuntime(324):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
06-05 17:19:18.854: E/AndroidRuntime(324):  at dalvik.system.NativeStart.main(Native Method) 

Adapter_ConversationFragmentAdapter.java:146 是 onPreExecute() 中的这一行:

pb = (ProgressBar) rootView.findViewById(R.id.progressbar2);

【问题讨论】:

  • 试试,ListAdapter listAdapter = new Adapter_ConversationFragmentAdapter(getActivity(), R.layout.items_conversation, getListView().getRootView());

标签: java android android-intent android-fragments android-asynctask


【解决方案1】:

onCreateonCreateView 之前调用

更多信息Android Developer Site

在您的场景中,您在 onCreate 方法中创建适配器,但在 onCreateView 中初始化视图,因此您得到 NPE,因为在适配器类中 rootView 为 null

您在 onCreate 方法中调用以下代码:

ListAdapter listAdapter = new Adapter_ConversationFragmentAdapter(getActivity(), R.layout.items_conversation,myFragmentView);
setListAdapter(listAdapter);

myFragmentView 在 onCreateView 中被初始化,所以在 onCreate 方法中为 null,所以可以使用如下代码:

将以下代码复制到 onCreate 方法:

myFragmentView = inflater.inflate(R.layout.fragment_conversation, container, false);

或在该行之后移动适配器初始化

更新

将您的代码更改为:

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {

        myFragmentView = inflater.inflate(R.layout.fragment_conversation, container, false);

        ListAdapter listAdapter = new Adapter_ConversationFragmentAdapter(getActivity(), R.layout.items_conversation,myFragmentView);
        setListAdapter(listAdapter);

        return myFragmentView;
    }

并删除 onCreate 部分

【讨论】:

  • 我按照你说的移动了适配器。它奏效了。谢谢。达美加姆;)
【解决方案2】:

这是因为如果在 xml 布局文件中找不到输入 id,findViewById 可以返回空值。

Finds a view that was identified by the id attribute from the XML that was processed in onCreate(Bundle).

Returns
The view if found or null otherwise.

我建议您检查您是否附加了正确的布局文件,以及其中是否有正确的 id。

同时检查 rootview 是否为空(您可以使用 if(rootview == null) 进行检查)

【讨论】:

  • 感谢您的回答。 rootView 为空。但它的名称是正确的,并且在该布局中有一个 ID 为 progressbar2 的视图。正如@shayan-pourvatan 所说,这是因为在 OnCreateView 之前调用了 onCreate。我该怎么办?
猜你喜欢
  • 1970-01-01
  • 2015-06-22
  • 1970-01-01
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多