Reputation: 631
I am using a custom list view inside a class that extends the "Fragment". This custom list view is set to open when one of the navigation drawer items is clicked. So the hierarchy is like this:
MainActivity.java (extends Activity)
The problem is, the program works absolutely fine when I DO NOT add the item click listener into the onCreateView() method. But, when I do, the log cat throws errors pointing to 2 locations - one at the XML below at part where the fragment tag is declared, and the other at the MyList.java where the item click listener has been defined.
I've commented on the exact locations where the logcat is pointing errors at in MyList.java and the XML file.
Why is this happening? I'm looking to have each list item clickable and perform some action on click.
The XML for MainActivity (using a drawer layout) -
<android.support.v4.widget.DrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<!-- Logcat points error on the beginning of the fragment tag -->
<fragment
class="com.example.test.MyList"
android:id="@+id/fragment1"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<!-- Logcat points error here at the beginning of the fragment tag -->
<!-- Framelayout to display Fragments -->
<FrameLayout
android:id="@+id/frame_container"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<!-- Listview to display slider menu -->
<ListView
android:id="@+id/list_slidermenu"
android:layout_width="240dp"
android:layout_height="match_parent"
android:layout_gravity="start"
android:choiceMode="singleChoice"
android:divider="@color/list_divider"
android:dividerHeight="1dp"
android:listSelector="@drawable/list_selector"
android:background="@color/list_background"/>
</android.support.v4.widget.DrawerLayout>
MyList.java:
import java.util.ArrayList;
import android.app.Fragment;
import android.content.Context;
import android.content.res.Resources;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
public class MyList extends Fragment {
ListView list;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedinstanceState)
{
/* Log cat points here too, at the beginning of setOnItemClickListener */
list.setOnItemClickListener(new OnItemClickListener(){
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
System.out.println("Works!");
}
});
return inflater.inflate(R.layout.listview, container, false);
}
@Override
public void onStart() {
super.onStart();
list=(ListView)getView().findViewById(R.id.listView1);
list.setAdapter(new List1Adapter(getActivity()));
}
}
class List1Adapter extends BaseAdapter
{
ArrayList<SingleRow> list;
Context context;
List1Adapter(Context c)
{
context=c;
list=new ArrayList<SingleRow>();
Resources res=c.getResources();
String[] title=res.getStringArray(R.array.titles);
String[] description=res.getStringArray(R.array.descriptions);
int[] images={R.drawable.img1,R.drawable.img2,R.drawable.img3,R.drawable.img4};
for(int i=0;i<3;i++)
{
list.add(new SingleRow(title[i],description[i],images[i]));
}
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return list.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return list.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater=(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View row=inflater.inflate(R.layout.list_rows, parent, false);
TextView title=(TextView)row.findViewById(R.id.textView1);
TextView description=(TextView)row.findViewById(R.id.textView2);
ImageView image=(ImageView)row.findViewById(R.id.imageView1);
SingleRow temp=list.get(position);
title.setText(temp.title);
description.setText(temp.description);
image.setImageResource(temp.image);
return row;
}
class SingleRow
{
String title;
String description;
int image;
SingleRow(String title, String description, int image)
{
this.title=title;
this.description=description;
this.image=image;
}
}
}
Logcat:
02-14 10:25:14.248: E/ActivityThread(22106): Failed to inflate
02-14 10:25:14.248: E/ActivityThread(22106): android.view.InflateException: Binary XML file line #7: Error inflating class fragment
02-14 10:25:14.248: E/ActivityThread(22106): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:713)
02-14 10:25:14.248: E/ActivityThread(22106): at android.view.LayoutInflater.rInflate(LayoutInflater.java:755)
02-14 10:25:14.248: E/ActivityThread(22106): at android.view.LayoutInflater.inflate(LayoutInflater.java:492)
02-14 10:25:14.248: E/ActivityThread(22106): at android.view.LayoutInflater.inflate(LayoutInflater.java:397)
02-14 10:25:14.248: E/ActivityThread(22106): at android.view.LayoutInflater.inflate(LayoutInflater.java:353)
02-14 10:25:14.248: E/ActivityThread(22106): at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:320)
02-14 10:25:14.248: E/ActivityThread(22106): at android.app.Activity.setContentView(Activity.java:1895)
02-14 10:25:14.248: E/ActivityThread(22106): at com.example.test.MainActivity.onCreate(MainActivity.java:40)
02-14 10:25:14.248: E/ActivityThread(22106): at android.app.Activity.performCreate(Activity.java:5133)
02-14 10:25:14.248: E/ActivityThread(22106): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
02-14 10:25:14.248: E/ActivityThread(22106): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2293)
02-14 10:25:14.248: E/ActivityThread(22106): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2389)
02-14 10:25:14.248: E/ActivityThread(22106): at android.app.ActivityThread.access$600(ActivityThread.java:153)
02-14 10:25:14.248: E/ActivityThread(22106): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1269)
02-14 10:25:14.248: E/ActivityThread(22106): at android.os.Handler.dispatchMessage(Handler.java:99)
02-14 10:25:14.248: E/ActivityThread(22106): at android.os.Looper.loop(Looper.java:137)
02-14 10:25:14.248: E/ActivityThread(22106): at android.app.ActivityThread.main(ActivityThread.java:5289)
02-14 10:25:14.248: E/ActivityThread(22106): at java.lang.reflect.Method.invokeNative(Native Method)
02-14 10:25:14.248: E/ActivityThread(22106): at java.lang.reflect.Method.invoke(Method.java:525)
02-14 10:25:14.248: E/ActivityThread(22106): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:739)
02-14 10:25:14.248: E/ActivityThread(22106): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:555)
02-14 10:25:14.248: E/ActivityThread(22106): at dalvik.system.NativeStart.main(Native Method)
02-14 10:25:14.248: E/ActivityThread(22106): Caused by: java.lang.NullPointerException
02-14 10:25:14.248: E/ActivityThread(22106): at com.example.test.List.onCreateView(MyList.java:27)
02-14 10:25:14.248: E/ActivityThread(22106): at android.app.Fragment.performCreateView(Fragment.java:1695)
02-14 10:25:14.248: E/ActivityThread(22106): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:861)
02-14 10:25:14.248: E/ActivityThread(22106): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1035)
02-14 10:25:14.248: E/ActivityThread(22106): at android.app.FragmentManagerImpl.addFragment(FragmentManager.java:1137)
02-14 10:25:14.248: E/ActivityThread(22106): at android.app.Activity.onCreateView(Activity.java:4746)
02-14 10:25:14.248: E/ActivityThread(22106): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:689)
02-14 10:25:14.248: E/ActivityThread(22106): ... 21 more
02-14 10:25:14.258: D/AndroidRuntime(22106): Shutting down VM
02-14 10:25:14.258: W/dalvikvm(22106): threadid=1: thread exiting with uncaught exception (group=0x415687c0)
02-14 10:25:14.268: E/AndroidRuntime(22106): FATAL EXCEPTION: main
02-14 10:25:14.268: E/AndroidRuntime(22106): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.test/com.example.test.MainActivity}: android.view.InflateException: Binary XML file line #7: Error inflating class fragment
02-14 10:25:14.268: E/AndroidRuntime(22106): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2339)
02-14 10:25:14.268: E/AndroidRuntime(22106): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2389)
02-14 10:25:14.268: E/AndroidRuntime(22106): at android.app.ActivityThread.access$600(ActivityThread.java:153)
02-14 10:25:14.268: E/AndroidRuntime(22106): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1269)
02-14 10:25:14.268: E/AndroidRuntime(22106): at android.os.Handler.dispatchMessage(Handler.java:99)
02-14 10:25:14.268: E/AndroidRuntime(22106): at android.os.Looper.loop(Looper.java:137)
02-14 10:25:14.268: E/AndroidRuntime(22106): at android.app.ActivityThread.main(ActivityThread.java:5289)
02-14 10:25:14.268: E/AndroidRuntime(22106): at java.lang.reflect.Method.invokeNative(Native Method)
02-14 10:25:14.268: E/AndroidRuntime(22106): at java.lang.reflect.Method.invoke(Method.java:525)
02-14 10:25:14.268: E/AndroidRuntime(22106): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:739)
02-14 10:25:14.268: E/AndroidRuntime(22106): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:555)
02-14 10:25:14.268: E/AndroidRuntime(22106): at dalvik.system.NativeStart.main(Native Method)
02-14 10:25:14.268: E/AndroidRuntime(22106): Caused by: android.view.InflateException: Binary XML file line #7: Error inflating class fragment
02-14 10:25:14.268: E/AndroidRuntime(22106): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:713)
02-14 10:25:14.268: E/AndroidRuntime(22106): at android.view.LayoutInflater.rInflate(LayoutInflater.java:755)
02-14 10:25:14.268: E/AndroidRuntime(22106): at android.view.LayoutInflater.inflate(LayoutInflater.java:492)
02-14 10:25:14.268: E/AndroidRuntime(22106): at android.view.LayoutInflater.inflate(LayoutInflater.java:397)
02-14 10:25:14.268: E/AndroidRuntime(22106): at android.view.LayoutInflater.inflate(LayoutInflater.java:353)
02-14 10:25:14.268: E/AndroidRuntime(22106): at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:320)
02-14 10:25:14.268: E/AndroidRuntime(22106): at android.app.Activity.setContentView(Activity.java:1895)
02-14 10:25:14.268: E/AndroidRuntime(22106): at com.example.test.MainActivity.onCreate(MainActivity.java:40)
02-14 10:25:14.268: E/AndroidRuntime(22106): at android.app.Activity.performCreate(Activity.java:5133)
02-14 10:25:14.268: E/AndroidRuntime(22106): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
02-14 10:25:14.268: E/AndroidRuntime(22106): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2293)
02-14 10:25:14.268: E/AndroidRuntime(22106): ... 11 more
02-14 10:25:14.268: E/AndroidRuntime(22106): Caused by: java.lang.NullPointerException
02-14 10:25:14.268: E/AndroidRuntime(22106): at com.example.test.List.onCreateView(MyList.java:27)
02-14 10:25:14.268: E/AndroidRuntime(22106): at android.app.Fragment.performCreateView(Fragment.java:1695)
02-14 10:25:14.268: E/AndroidRuntime(22106): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:861)
02-14 10:25:14.268: E/AndroidRuntime(22106): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1035)
02-14 10:25:14.268: E/AndroidRuntime(22106): at android.app.FragmentManagerImpl.addFragment(FragmentManager.java:1137)
02-14 10:25:14.268: E/AndroidRuntime(22106): at android.app.Activity.onCreateView(Activity.java:4746)
02-14 10:25:14.268: E/AndroidRuntime(22106): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:689)
02-14 10:25:14.268: E/AndroidRuntime(22106): ... 21 more
Upvotes: 0
Views: 672
Reputation: 14590
Remove this import
import android.app.Fragment;
and import Fragment
from support library..
import android.support.v4.app.Fragment;
that too your list object is null in onCreateView
method.. so move this
list.setOnItemClickListener(new OnItemClickListener(){
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
System.out.println("Works!");
}
});
to onStart
method..
Upvotes: 2