2014-02-14 2 views
0

Я использую пользовательский список в классе, который расширяет «Фрагмент». Это настраиваемое представление списка открывается, когда нажимается один из элементов ящика навигации. Таким образом, иерархия такова:Сбой приложения только при подключении «setOnItemClickListener»

MainActivity.java (расширяет активность)

  • MyList.java (расширяет фрагмент)

Проблема заключается в том, что программа работает абсолютно нормально, когда я НЕ добавьте элемент listen list в метод onCreateView(). Но когда я это делаю, лог-кошка выдает ошибки, указывающие на 2 местоположения - один в XML ниже в части, где объявлен тег фрагмента, а другой в MyList.java, где был определен элемент прослушивания элемента.

Я прокомментировал точные местоположения, в которых logcat указывает ошибки в MyList.java и файле XML.

Почему это происходит? Я ищу, чтобы каждый элемент списка был кликабельным и выполнял некоторые действия при нажатии.

XML, для MainActivity (с использованием макета ящика) -

<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 
+0

Использовать фрагмент из библиотеки поддержки. –

+0

, что тоже ваш список не инициализирован. Listener в методе onStart .. –

ответ

2

Удалить этот импорт

import android.app.Fragment; 

и импортировать Fragment из библиотеки поддержки ..

import android.support.v4.app.Fragment; 

что тоже список вашего объект является недействительным в onCreateView методы .. поэтому двигайтесь этим

list.setOnItemClickListener(new OnItemClickListener(){ 

     @Override 
     public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, 
       long arg3) { 

      System.out.println("Works!"); 
     } 
     }); 

до onStart способ ..

1

Я думаю, что это может помочь вам получить свое решение. , ,

Явное добавить OnItemClickListener к вашему ListView

myList.setOnItemClickListener(this); 

Вы также должны убедиться, что ваш фрагмент реализует тип OnItemClickListener:

public class MainFiles extends Fragment implements OnItemClickListener 

ответить мне, если и получить любой вопрос.

Смежные вопросы