2013-02-14 3 views
0

Мое приложение падает, когда я нажимаю на элемент. Мой код не имеет ошибок в eclipse, но когда я нажимаю на один из элементов, которые он говорит (к сожалению, приложение перестало работать), и LogCat выплевывает кучу ошибок, один из которых: 02-14 04: 33: 20.010: E/MessageQueue-JNI (774): java.lang.NullPointerException. Любые идеи по устранению этой проблемы?App crashes onItemClick

package com.carouseldemo.main; 

import com.carouseldemo.controls.Carousel; 

import com.carouseldemo.controls.CarouselAdapter; 
import com.carouseldemo.controls.CarouselAdapter.OnItemClickListener; 
/**import com.carouseldemo.controls.CarouselAdapter.OnItemSelectedListener;*/ 
import com.carouseldemo.controls.CarouselItem; 


import android.app.Activity; 
import android.os.Bundle; 
import android.view.Gravity; 
import android.view.LayoutInflater; 
import android.view.MenuInflater; 
import android.view.Menu; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.TextView; 
import android.widget.Toast; 




public class MainActivity extends Activity { 

    /** Called when the activity is first created. */ 
    @Override 
    public boolean onCreateOptionsMenu(Menu menu){ 
     MenuInflater inflater = getMenuInflater(); 
     inflater.inflate(R.menu.testmenu, menu); 
     return true; 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     Carousel carousel = (Carousel)findViewById(R.id.carousel); 

     carousel.setOnItemClickListener(new OnItemClickListener(){ 

      public void onItemClick(CarouselAdapter<?> parent, View view, 
        int position, long id) {  
       LayoutInflater inflater = getLayoutInflater(); 
       View layout = inflater.inflate(R.layout.toast_layout, 
               (ViewGroup) findViewById(R.id.toast_layout_root)); 

       TextView text = (TextView) layout.findViewById(R.id.selected_item); 
       text.setText("This is a custom toast"); 

       Toast toast = new Toast(getApplicationContext()); 
       toast.setGravity(Gravity.CENTER_VERTICAL, 0, 0); 
       toast.setDuration(Toast.LENGTH_LONG); 
       toast.setView(layout); 
       toast.show(); 


       Toast.makeText(MainActivity.this, 
         String.format("%s has been clicked", 
         ((CarouselItem)parent.getChildAt(position)).getName()), 
         Toast.LENGTH_SHORT).show();z 
    } 



     }); 


     /** carousel.setOnItemSelectedListener(new OnItemSelectedListener(){ 

      public void onItemSelected(CarouselAdapter<?> parent, View view, 
        int position, long id) { 

       final TextView txt = (TextView)(findViewById(R.id.selected_item)); 

       switch(position){ 
       case 0: 
        txt.setText("The cat (Felis catus), also known as the domestic cat or housecat to distinguish it from other felids and felines, is a small, usually furry, domesticated, carnivorous mammal that is valued by humans for its companionship and for its ability to hunt vermin and household pests. Cats have been associated with humans for at least 9,500 years, and are currently the most popular pet in the world. Owing to their close association with humans, cats are now found almost everywhere in the world."); 
        break; 
       case 1: 
        txt.setText("The hippopotamus (Hippopotamus amphibius), or hippo, from the ancient Greek for \"river horse\" (ἱπποπόταμος), is a large, mostly herbivorous mammal in sub-Saharan Africa, and one of only two extant species in the family Hippopotamidae (the other is the Pygmy Hippopotamus.) After the elephant, the hippopotamus is the third largest land mammal and the heaviest extant artiodactyl."); 
        break; 
       case 2: 
        txt.setText("A monkey is a primate, either an Old World monkey or a New World monkey. There are about 260 known living species of monkey. Many are arboreal, although there are species that live primarily on the ground, such as baboons. Monkeys are generally considered to be intelligent. Unlike apes, monkeys usually have tails. Tailless monkeys may be called \"apes\", incorrectly according to modern usage; thus the tailless Barbary macaque is called the \"Barbary ape\"."); 
        break; 
       case 3: 
        txt.setText("A mouse (plural: mice) is a small mammal belonging to the order of rodents. The best known mouse species is the common house mouse (Mus musculus). It is also a popular pet. In some places, certain kinds of field mice are also common. This rodent is eaten by large birds such as hawks and eagles. They are known to invade homes for food and occasionally shelter."); 
        break; 
       case 4: 
        txt.setText("The giant panda, or panda (Ailuropoda melanoleuca, literally meaning \"black and white cat-foot\") is a bear native to central-western and south western China.[4] It is easily recognized by its large, distinctive black patches around the eyes, over the ears, and across its round body. Though it belongs to the order Carnivora, the panda's diet is 99% bamboo."); 
        break; 
       case 5: 
        txt.setText("Rabbits (or, colloquially, bunnies) are small mammals in the family Leporidae of the order Lagomorpha, found in several parts of the world. There are eight different genera in the family classified as rabbits, including the European rabbit (Oryctolagus cuniculus), cottontail rabbits (genus Sylvilagus; 13 species), and the Amami rabbit (Pentalagus furnessi, an endangered species on Amami ÅŒshima, Japan)"); 
        break; 
       } 
          } 

      public void onNothingSelected(CarouselAdapter<?> parent) {   } 


     } 
     );*/ 

    } 
    } 

LogCat журнал ошибок:

02-14 14:38:09.137: E/InputEventReceiver(996): Exception dispatching input event. 
02-14 14:38:09.148: E/MessageQueue-JNI(996): Exception in MessageQueue callback: handleReceiveCallback 
02-14 14:38:09.207: E/MessageQueue-JNI(996): java.lang.NullPointerException 
02-14 14:38:09.207: E/MessageQueue-JNI(996): at com.carouseldemo.main.MainActivity$1.onItemClick(MainActivity.java:50) 
02-14 14:38:09.207: E/MessageQueue-JNI(996): at com.carouseldemo.controls.CarouselAdapter.performItemClick(CarouselAdapter.java:261) 
02-14 14:38:09.207: E/MessageQueue-JNI(996): at com.carouseldemo.controls.Carousel.onSingleTapUp(Carousel.java:967) 
02-14 14:38:09.207: E/MessageQueue-JNI(996): at android.view.GestureDetector.onTouchEvent(GestureDetector.java:588) 
02-14 14:38:09.207: E/MessageQueue-JNI(996): at com.carouseldemo.controls.Carousel.onTouchEvent(Carousel.java:311) 
02-14 14:38:09.207: E/MessageQueue-JNI(996): at android.view.View.dispatchTouchEvent(View.java:7239) 
02-14 14:38:09.207: E/MessageQueue-JNI(996): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2168) 
02-14 14:38:09.207: E/MessageQueue-JNI(996): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1903) 
02-14 14:38:09.207: E/MessageQueue-JNI(996): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174) 
02-14 14:38:09.207: E/MessageQueue-JNI(996): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917) 
02-14 14:38:09.207: E/MessageQueue-JNI(996): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174) 
02-14 14:38:09.207: E/MessageQueue-JNI(996): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917) 
02-14 14:38:09.207: E/MessageQueue-JNI(996): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174) 
02-14 14:38:09.207: E/MessageQueue-JNI(996): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917) 
02-14 14:38:09.207: E/MessageQueue-JNI(996): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174) 
02-14 14:38:09.207: E/MessageQueue-JNI(996): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917) 
02-14 14:38:09.207: E/MessageQueue-JNI(996): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174) 
02-14 14:38:09.207: E/MessageQueue-JNI(996): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917) 
02-14 14:38:09.207: E/MessageQueue-JNI(996): at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1953) 
02-14 14:38:09.207: E/MessageQueue-JNI(996): at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1405) 
02-14 14:38:09.207: E/MessageQueue-JNI(996): at android.app.Activity.dispatchTouchEvent(Activity.java:2410) 
02-14 14:38:09.207: E/MessageQueue-JNI(996): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1901) 
02-14 14:38:09.207: E/MessageQueue-JNI(996): at android.view.View.dispatchPointerEvent(View.java:7419) 
02-14 14:38:09.207: E/MessageQueue-JNI(996): at android.view.ViewRootImpl.deliverPointerEvent(ViewRootImpl.java:3220) 
02-14 14:38:09.207: E/MessageQueue-JNI(996): at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:3165) 
02-14 14:38:09.207: E/MessageQueue-JNI(996): at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:4292) 
02-14 14:38:09.207: E/MessageQueue-JNI(996): at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:4271) 
02-14 14:38:09.207: E/MessageQueue-JNI(996): at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:4363) 
02-14 14:38:09.207: E/MessageQueue-JNI(996): at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:179) 
02-14 14:38:09.207: E/MessageQueue-JNI(996): at android.os.MessageQueue.nativePollOnce(Native Method) 
02-14 14:38:09.207: E/MessageQueue-JNI(996): at android.os.MessageQueue.next(MessageQueue.java:125) 
02-14 14:38:09.207: E/MessageQueue-JNI(996): at android.os.Looper.loop(Looper.java:124) 
02-14 14:38:09.207: E/MessageQueue-JNI(996): at android.app.ActivityThread.main(ActivityThread.java:5039) 
02-14 14:38:09.207: E/MessageQueue-JNI(996): at java.lang.reflect.Method.invokeNative(Native Method) 
02-14 14:38:09.207: E/MessageQueue-JNI(996): at java.lang.reflect.Method.invoke(Method.java:511) 
02-14 14:38:09.207: E/MessageQueue-JNI(996): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
02-14 14:38:09.207: E/MessageQueue-JNI(996): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
02-14 14:38:09.207: E/MessageQueue-JNI(996): at dalvik.system.NativeStart.main(Native Method) 
02-14 14:38:09.247: D/AndroidRuntime(996): Shutting down VM 
02-14 14:38:09.247: W/dalvikvm(996): threadid=1: thread exiting with uncaught exception (group=0x40a70930) 
02-14 14:38:09.327: E/AndroidRuntime(996): FATAL EXCEPTION: main 
02-14 14:38:09.327: E/AndroidRuntime(996): java.lang.NullPointerException 
02-14 14:38:09.327: E/AndroidRuntime(996): at com.carouseldemo.main.MainActivity$1.onItemClick(MainActivity.java:50) 
02-14 14:38:09.327: E/AndroidRuntime(996): at com.carouseldemo.controls.CarouselAdapter.performItemClick(CarouselAdapter.java:261) 
02-14 14:38:09.327: E/AndroidRuntime(996): at com.carouseldemo.controls.Carousel.onSingleTapUp(Carousel.java:967) 
02-14 14:38:09.327: E/AndroidRuntime(996): at android.view.GestureDetector.onTouchEvent(GestureDetector.java:588) 
02-14 14:38:09.327: E/AndroidRuntime(996): at com.carouseldemo.controls.Carousel.onTouchEvent(Carousel.java:311) 
02-14 14:38:09.327: E/AndroidRuntime(996): at android.view.View.dispatchTouchEvent(View.java:7239) 
02-14 14:38:09.327: E/AndroidRuntime(996): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2168) 
02-14 14:38:09.327: E/AndroidRuntime(996): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1903) 
02-14 14:38:09.327: E/AndroidRuntime(996): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174) 
02-14 14:38:09.327: E/AndroidRuntime(996): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917) 
02-14 14:38:09.327: E/AndroidRuntime(996): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174) 
02-14 14:38:09.327: E/AndroidRuntime(996): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917) 
02-14 14:38:09.327: E/AndroidRuntime(996): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174) 
02-14 14:38:09.327: E/AndroidRuntime(996): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917) 
02-14 14:38:09.327: E/AndroidRuntime(996): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174) 
02-14 14:38:09.327: E/AndroidRuntime(996): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917) 
02-14 14:38:09.327: E/AndroidRuntime(996): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174) 
02-14 14:38:09.327: E/AndroidRuntime(996): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917) 
02-14 14:38:09.327: E/AndroidRuntime(996): at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1953) 
02-14 14:38:09.327: E/AndroidRuntime(996): at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1405) 
02-14 14:38:09.327: E/AndroidRuntime(996): at android.app.Activity.dispatchTouchEvent(Activity.java:2410) 
02-14 14:38:09.327: E/AndroidRuntime(996): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1901) 
02-14 14:38:09.327: E/AndroidRuntime(996): at android.view.View.dispatchPointerEvent(View.java:7419) 
02-14 14:38:09.327: E/AndroidRuntime(996): at android.view.ViewRootImpl.deliverPointerEvent(ViewRootImpl.java:3220) 
02-14 14:38:09.327: E/AndroidRuntime(996): at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:3165) 
02-14 14:38:09.327: E/AndroidRuntime(996): at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:4292) 
02-14 14:38:09.327: E/AndroidRuntime(996): at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:4271) 
02-14 14:38:09.327: E/AndroidRuntime(996): at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:4363) 
02-14 14:38:09.327: E/AndroidRuntime(996): at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:179) 
02-14 14:38:09.327: E/AndroidRuntime(996): at android.os.MessageQueue.nativePollOnce(Native Method) 
02-14 14:38:09.327: E/AndroidRuntime(996): at android.os.MessageQueue.next(MessageQueue.java:125) 
02-14 14:38:09.327: E/AndroidRuntime(996): at android.os.Looper.loop(Looper.java:124) 
02-14 14:38:09.327: E/AndroidRuntime(996): at android.app.ActivityThread.main(ActivityThread.java:5039) 
02-14 14:38:09.327: E/AndroidRuntime(996): at java.lang.reflect.Method.invokeNative(Native Method) 
02-14 14:38:09.327: E/AndroidRuntime(996): at java.lang.reflect.Method.invoke(Method.java:511) 
02-14 14:38:09.327: E/AndroidRuntime(996): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
02-14 14:38:09.327: E/AndroidRuntime(996): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
02-14 14:38:09.327: E/AndroidRuntime(996): at dalvik.system.NativeStart.main(Native Method) 
+0

Вы можете указать, какая строка - строка 50 – Tobrun

+0

, пожалуйста, проверьте, является ли ((CarouselItem) parent.getChildAt (position)). GetName() leeds для NPE. –

+0

Привет, Стефан, да, как я могу это исправить. – user2000734

ответ

0

parent.getChildAt (я) даст I-й VISIBLE ребенка вид родителя, НЕ вид ребенка, представляющий i-й элемент.

Позвольте мне объяснить по-другому. Предположим, что ваш адаптер имеет 100 элементов. Вы можете ожидать, что parent.getChildAt (99) предоставит представление, представляющее последний элемент: Это неправильно. Для повышения производительности AdapterView создает дочерние представления для элементов, которые должны отображаться в настоящее время. Например, если вы прокручиваетесь в верхней части списка, и у вас есть 5 элементов, у AdaptView, вероятно, есть 5 или 6 дочерних. В этом случае parent.getChildAt (99) даст нулевую ссылку.

Actaully, дочерний вид, который нажал, уже задан с помощью метода onItemClicked: аргумент second'view '. Вы можете изменить свой код следующим образом.

Toast.makeText(MainActivity.this, 
    String.format("%s has been clicked",  
    ((CarouselItem)view).getName()), 
    Toast.LENGTH_SHORT).show(); 

Edit:

Кроме того, следующий фрагмент кода также является подозрительным.

 LayoutInflater inflater = getLayoutInflater(); 
     View layout = inflater.inflate(R.layout.toast_layout, 
             (ViewGroup) findViewById(R.id.toast_layout_root)); 


     TextView text = (TextView) layout.findViewById(R.id.selected_item); 
     text.setText("This is a custom toast"); 

Здесь вы раздувание toast_layout.xml в цели и добавить его к другой точке зрения (R.id.toast_layout_root), который уже подключен к окну приложения. Это приведет к отображению представления, завышенного от toast_layout.xml, в главном окне приложения.

Однако вы используете завышенный вид как макет тоста, который отображается как отдельное окно.

+0

Привет, Jiyong, я попытался использовать ваш код, но он делает то же самое. Мое приложение падает? Не могли бы вы дать больше предложений, пожалуйста. Спасибо – user2000734

+0

Имеет ли использование этого кода то же сообщение об ошибке, что и раньше, или новое? –

+0

Можете ли вы точно показать мне линию №50? –

0

Похоже линии 50 в вашем LogCat ссылается на эту строку:

Toast.makeText(MainActivity.this, 
    String.format("%s has been clicked",  
    ((CarouselItem)parent.getChildAt(position)).getName()), 
    Toast.LENGTH_SHORT).show(); 

Я предполагаю, что это получение NullPointerException из этой части :

((CarouselItem)parent.getChildAt(position)).getName()) 

Я бы рекомендовал запустить его с помощью отладчика, добавить точку останова в этой строке и посмотреть все, чтобы увидеть, что происходит. Может быть, даже захватить CarouselItem в переменной в строке выше, чтобы сделать его легче анализировать:

CarouselItem item = (CarouselItem) parent.getChildAt(position); 
+0

Спасибо, Бен, я попробовал, но ничего не нашел. Я буду продолжать искать в то же время больше предложений, чем приветствую, пожалуйста. Спасибо. – user2000734