0

单击某个项目时,我的应用程序崩溃。我的代码在 Eclipse 中没有错误,但是当我单击其中一个项目时(不幸的是,应用程序已停止工作)并且 LogCat 吐出一堆错误,其中一个是:02-14 04:33:20.010:E /MessageQueue-JNI(774​​):java.lang.NullPointerException。关于如何解决这个问题的任何想法?

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)
4

2 回答 2

0

看起来你的 logcat 中的第 50 行是指这一行:

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);
于 2013-02-14T15:04:16.350 回答
0

parent.getChildAt(i) 将给出父级的第 i 个 VISIBLE 子视图,而不是代表第 i 个项目的子视图。

让我换一种方式解释。假设您的 AdapterView 有 100 个项目。您可能期望 parent.getChildAt(99) 将给出表示最后一项的视图:这是错误的。对于性能问题,AdapterView 为当前需要显示的项目创建子视图。例如,如果您在列表顶部滚动,并且显示了 5 个项目,则 AdapterView 可能有 5 或 6 个子视图。在这种情况下, parent.getChildAt(99) 将给出空引用。

实际上,单击的子视图已经通过 onItemClicked 方法给出:第二个“视图”参数。您可以按如下方式修改您的代码。

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

编辑:

此外,以下代码片段也很可疑。

        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 膨胀的视图显示在主应用程序窗口中。

但是,您使用膨胀视图作为 toast 的布局,该布局呈现为单独的窗口。

于 2013-02-14T15:17:57.447 回答