2013-12-20 32 views
0

當我運行我的應用程序時,我不斷收到第56行的NullPointerException,如下面的調試日誌所示。我對android應用程序編程相對較新,所以我無法弄清楚這裏發生了什麼。有人能幫我解決這個問題嗎? 我MainActivity.java:MainAcitivity中的java.lang.NullPointerException setOnClickListener

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; 
     } 
    } 

} 

這是試圖運行應用程序時,我的調試日誌:

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 

清單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中:

<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:

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

是什麼線56 MainActivity.java? – Raghunandan

+0

我認爲按鈕在片段內,因此設置適配器內的點擊偵聽器。你不能在這裏得到它 –

+0

可能是按鈕是問題 –

回答

1

感謝大家的輸入開始打印的位置值,並且它的所有工作結束NPE,但事實並非如此執行我希望完成的任務。我將該按鈕添加到y 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; 
    } 
} 
} 
1

檢查R.id.button,按鈕是在R.layout.activity_main佈局..

安置自己的activity_main.xml佈局。

做下面的事情。

添加您的按鈕在activity_main.xml或更改代碼

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

這是否給予'NullPointerException'? – Raghunandan

+0

@Raghunandan可能是。 –

+3

this won; t cause NPE – Raghunandan

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

按鈕爲空。在初始化失敗activity_main.xml

極品按鈕,也ID應該是按鈕

findViewById查找與當前膨脹的佈局id的視圖。所以如果你有按鈕在activity_main.xml那麼你的初始化工作,否則你得到NPE`

activity_main.xml沒有按鈕。 S0 button = (Button) findViewById(R.id.button);失敗

按鈕位於fragment1中。因此,您需要對佈局進行充氣,然後初始化onCreateView中的按鈕,而不是初始化Activity中的按鈕。

2

您需要在activity_main.xml中按鈕,因爲您已經在fragment_1.xml中添加了該按鈕,這是NPE的原因。

添加buttonactivity_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> 
0

嘗試

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

中的onCreate

然後嘗試

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

你的錯誤是在爲getItem(poistion)方法。即使你的適配器大小是5,它給你的位置大於5.在這樣的時刻,你從那裏返回null。

您可以通過添加日誌語句檢查此在的getItem方法

-1
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(); 
     } 
    }); 
+1

你可以請你解釋一下你的解決方案! –

+0

nullpointerexception當一個對象爲null時發生,我認爲你必須在第一個事物中定義你的aobject,然後工作到它的方法,你可以用這種方式測試,我希望這種方式可以幫助你。 – saeid

+1

歡迎@saeid,這個答案只不過是你之前的其他人。你的答案有什麼不同? – AxelH

相關問題