简体   繁体   English

MainAcitivity中的java.lang.NullPointerException setOnClickListener

[英]java.lang.NullPointerException in MainAcitivity setOnClickListener

When I run my application, I keep getting a NullPointerException on line 56 as shown in the debug log below. 当我运行我的应用程序时,我在第56行继续获得NullPointerException,如下面的调试日志所示。 I am relatively new to programming android applications, so I can't figure out what's going on here. 我对Android应用程序的编程比较陌生,所以我无法弄清楚这里发生了什么。 Can someone please help me out with this? 有人可以帮我解决这个问题吗? My MainActivity.java: 我的MainActivity.java:

package com.termite.pockettube;

import java.util.Locale;

import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.app.NavUtils;
import android.support.v4.view.ViewPager;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends FragmentActivity implements View.OnClickListener{

    /**
     * The {@link android.support.v4.view.PagerAdapter} that will provide
     * fragments for each of the sections. We use a
     * {@link android.support.v4.app.FragmentPagerAdapter} derivative, which
     * will keep every loaded fragment in memory. If this becomes too memory
     * intensive, it may be best to switch to a
     * {@link android.support.v4.app.FragmentStatePagerAdapter}.
     */
    SectionsPagerAdapter mSectionsPagerAdapter;

    /**
     * The {@link ViewPager} that will host the section contents.
     */
    ViewPager mViewPager;

     Button button;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Create the adapter that will return a fragment for each of the three
        // primary sections of the app.
        mSectionsPagerAdapter = new SectionsPagerAdapter(
                getSupportFragmentManager());

        // Set up the ViewPager with the sections adapter.
        mViewPager = (ViewPager) findViewById(R.id.pager);
        mViewPager.setAdapter(mSectionsPagerAdapter);

        button = (Button) findViewById(R.id.button);
        button.setOnClickListener(this); //this is line 56
    }
    public void countryOnClick() {
        startActivity(new Intent("com.termite.pockettube.COUNTRY"));
    }
    @Override
public void onClick(View v) {
    switch (v.getId()){
    case R.id.button:
        countryOnClick();
        break;
    }
}
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    /**
     * A {@link FragmentPagerAdapter} that returns a fragment corresponding to
     * one of the sections/tabs/pages.
     */
    public class SectionsPagerAdapter extends FragmentPagerAdapter {

        public SectionsPagerAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public Fragment getItem(int position) {
            // getItem is called to instantiate the fragment for the given page.
            // Return a DummySectionFragment (defined as a static inner class
            // below) with the page number as its lone argument.
            switch (position) {
            case 0:
                Fragment1 fragment1 = new Fragment1();
                return fragment1;
            case 1:
                Fragment2 fragment2 = new Fragment2();
                return fragment2;
            case 2:
                Fragment3 fragment3 = new Fragment3();
                return fragment3;
            case 3:
                Fragment4 fragment4 = new Fragment4();
                return fragment4;
            case 4:
                Fragment5 fragment5 = new Fragment5();
                return fragment5;
            }
            return null;
        }

        @Override
        public int getCount() {
            // Show 5 total pages.
            return 5;
        }

        @Override
        public CharSequence getPageTitle(int position) {
            Locale l = Locale.getDefault();
            switch (position) {
            case 0:
                return getString(R.string.title_section1).toUpperCase(l);
            case 1:
                return getString(R.string.title_section2).toUpperCase(l);
            case 2:
                return getString(R.string.title_section3).toUpperCase(l);
            case 3:
                return getString(R.string.title_section4).toUpperCase(l);
            case 4:
                return getString(R.string.title_section5).toUpperCase(l);
            }
            return null;
        }
    }

}

This is my debug log when attempting to run the application: 这是我尝试运行应用程序时的调试日志:

12-20 01:13:26.898: D/AndroidRuntime(6539): Shutting down VM
12-20 01:13:26.906: W/dalvikvm(6539): threadid=1: thread exiting with uncaught exception (group=0x40af21f8)
12-20 01:13:26.906: E/AndroidRuntime(6539): FATAL EXCEPTION: main
12-20 01:13:26.906: E/AndroidRuntime(6539): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.termite.pockettube/com.termite.pockettube.MainActivity}: java.lang.NullPointerException
12-20 01:13:26.906: E/AndroidRuntime(6539):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2035)
12-20 01:13:26.906: E/AndroidRuntime(6539):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2060)
12-20 01:13:26.906: E/AndroidRuntime(6539):     at android.app.ActivityThread.access$600(ActivityThread.java:127)
12-20 01:13:26.906: E/AndroidRuntime(6539):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1181)
12-20 01:13:26.906: E/AndroidRuntime(6539):     at android.os.Handler.dispatchMessage(Handler.java:99)
12-20 01:13:26.906: E/AndroidRuntime(6539):     at android.os.Looper.loop(Looper.java:137)
12-20 01:13:26.906: E/AndroidRuntime(6539):     at android.app.ActivityThread.main(ActivityThread.java:4558)
12-20 01:13:26.906: E/AndroidRuntime(6539):     at java.lang.reflect.Method.invokeNative(Native Method)
12-20 01:13:26.906: E/AndroidRuntime(6539):     at java.lang.reflect.Method.invoke(Method.java:511)
12-20 01:13:26.906: E/AndroidRuntime(6539):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
12-20 01:13:26.906: E/AndroidRuntime(6539):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
12-20 01:13:26.906: E/AndroidRuntime(6539):     at dalvik.system.NativeStart.main(Native Method)
12-20 01:13:26.906: E/AndroidRuntime(6539): Caused by: java.lang.NullPointerException
12-20 01:13:26.906: E/AndroidRuntime(6539):     at com.termite.pockettube.MainActivity.onCreate(MainActivity.java:56)
12-20 01:13:26.906: E/AndroidRuntime(6539):     at android.app.Activity.performCreate(Activity.java:4635)
12-20 01:13:26.906: E/AndroidRuntime(6539):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
12-20 01:13:26.906: E/AndroidRuntime(6539):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1999)
12-20 01:13:26.906: E/AndroidRuntime(6539):     ... 11 more

Manifest xml code: 清单xml代码:

    <uses-sdk
        android:minSdkVersion="11"
        android:targetSdkVersion="19" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.termite.pockettube.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name="com.termite.pockettube.CountryActivity"
            android:label="@string/title_activity_country" >
            <intent-filter>
                <action android:name="com.termite.pockettube.COUNTRY" />

                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>
    </application>

</manifest>

activity_main.xml: activity_main.xml中:

<android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/pager"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >

    <android.support.v4.view.PagerTabStrip
        android:id="@+id/pager_title_strip"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:layout_gravity="top"
        android:background="#33b5e5"
        android:paddingBottom="4dp"
        android:paddingTop="4dp"
        android:textColor="#fff" 
         >

    </android.support.v4.view.PagerTabStrip>



</android.support.v4.view.ViewPager>

fragment1.xml: fragment1.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity$DummySectionFragment" >

    <Button
        android:id="@+id/button"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:layout_alignParentTop="true"
        android:text="@string/button" />

</RelativeLayout>
button = (Button) findViewById(R.id.button);
button.setOnClickListener(this); //this is line 56

button is null. 按钮为空。 Initialization fails 初始化失败

Need button in activity_main.xml and also id should be button activity_main.xml需要按钮,id也应该是按钮

findViewById looks for a view with the id in the current inflated layout. findViewById在当前的膨胀布局中查找id为id的视图。 So if you have button in activity_main.xml then your initialization works else you get NPE` 因此,如果您在activity_main.xml有按钮,那么您的初始化将起作用,否则您将获得NPE

There is no button in activity_main.xml . activity_main.xml没有按钮。 S0 button = (Button) findViewById(R.id.button); S0 button = (Button) findViewById(R.id.button); fails 失败

Button is in fragment1. 按钮位于fragment1中。 So you will need to inflate the layout fragment1.xml and then initialize the button in onCreateView not initialize button in Activity. 因此,您需要对布局fragment1.xml进行膨胀,然后在Activity中的onCreateView not initialize按钮中初始化按钮。

You need to button in activity_main.xml as you had added that button in fragment_1.xml this is is the cause of NPE. 您需要在activity_main.xml按下,因为您在fragment_1.xml添加了该按钮,这是NPE的原因。

add button in activity_main.xml will solve your problem activity_main.xml添加button将解决您的问题

**activity_main.xml ** activity_main.xml中

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="@dimen/padding_Small"
    android:shrinkColumns="*"
    android:stretchColumns="*" >

    <android.support.v4.view.ViewPager
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/pager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity" >

        <android.support.v4.view.PagerTabStrip
            android:id="@+id/pager_title_strip"
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:layout_gravity="top"
            android:background="#33b5e5"
            android:paddingBottom="4dp"
            android:paddingTop="4dp"
            android:textColor="#fff" />
    </android.support.v4.view.ViewPager>

    <Button
        android:id="@+id/button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:text="ButtonText" />

</RelativeLayout>

Thank you all for your input, and it all worked to end the NPE, yet it didn't perform the task I wanted it to complete. 感谢大家的投入,这一切都有助于结束NPE,但它没有完成我希望它完成的任务。 I added the button to ,y Fragment1.java file and then it worked. 我将按钮添加到了,Fragment1.java文件,然后它工作了。

package com.termite.pockettube;

import com.termite.pockettube.MainActivity.SectionsPagerAdapter;

import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;

public class Fragment1 extends Fragment implements View.OnClickListener {
 Button button;
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        // Get the view from fragmenttab1.xml
        View view = inflater.inflate(R.layout.fragment1, container, false);
        button = (Button)view.findViewById(R.id.button);
        button.setOnClickListener(this);
        return view;
    }
   /* @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);


    }*/
    public void countryOnClick() {
        startActivity(new Intent("com.termite.pockettube.COUNTRY"));
    }
    @Override
public void onClick(View v) {
    switch (v.getId()){
    case R.id.button:
        countryOnClick();
        break;
    }
}
}

Check R.id.button , button is it in R.layout.activity_main layout.. 检查R.id.button ,按钮是否在R.layout.activity_main布局中..

Post your activity_main.xml layout. 发布您的activity_main.xml布局。

Do below thing. 做下面的事情。

Add your Button in activity_main.xml or change code activity_main.xml添加Button或更改代码

button = (Button) mViewPager.findViewById(R.id.button);
button.setOnClickListener(this);

Try 尝试

Button button = (Button) findViewById(R.id.button);
                button.setOnClickListener(buttonListener);

in onCreate 在onCreate

Then try 然后试试

private OnClickListener buttonListener = new OnClickListener() {
    public void onClick(View v) {
        //Do Work Here
    }
};

Your error is in the getItem(poistion) method. 您的错误在getItem(poistion)方法中。 even your adapter size is 5, it give you positions grater than 5. at such moments you return null from there. 即使您的适配器大小为5,它也会为您提供大于5的位置。在此时您从那里返回null。

you can check this by adding a Log statement to print the position value at the beginning of the getItem method 您可以通过添加Log语句来检查这一点,以在getItem方法的开头打印位置值

Button button=(Button)findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {   Toast.makeText(MainActivity.this,"RunAPP",Toast.LENGTH_LONG).show();
        }
    });

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM