[英]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.