2016-10-25 35 views
-1

我已經開始學習Java和Android開發,並且作爲第一個練習,我正嘗試爲Android開發一個使用自定義位置服務的Speedometer應用程序,問題似乎是當我初始化OnCreate方法中的按鈕時,這些無法找到。當爲一個按鈕調用setOnClickListener時出現NullPointerException - Android Studio

該應用程序基於滾動模板。

這是onCreate方法:

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

    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 
    // Create the adapter that will return a fragment for each of the three 
    // primary sections of the activity. 
    mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager()); 

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


    FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); 
    fab.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) 
        .setAction("Action", null).show(); 
     } 
    }); 

    // ATTENTION: This was auto-generated to implement the App Indexing API. 
    // See https://g.co/AppIndexing/AndroidStudio for more information. 
    client = new GoogleApiClient.Builder(this).addApi(AppIndex.API).build(); 


    speedText = (TextView) findViewById(R.id.speedText); 
    unitText = (TextView) findViewById(R.id.unitText); 
    startButton = (Button) findViewById(R.id.startButton); 
    resetButton = (Button) findViewById(R.id.resetButton); 


    if (!runtimePermissions()) //Will call a method that ckechs Location serivces are permited. 
    { 
     enableButtons(); 
    } 
} 

這是一個似乎會導致問題

private void enableButtons() //using this method will not require the use of two buttons for On/Off 
    { 
     startButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       startClickCount++; //Counts how many time the button has been clicked 
       if (startClickCount % 2 == 0) //If it is even 
       { 
        Intent i = new Intent(getApplicationContext(), GPSService.class); 
        startService(i); 

       } 
       else 
       { 
        Intent i = new Intent(getApplicationContext(), GPSService.class); 
        stopService(i); 
       } 

      } 
     }); 
    } 

這是我fragment_speedometer.xml編輯eneableButtons()方法

<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="com.amp.systems.performancespeedometer.Speedometer$PlaceholderFragment"> 


<Button 
    android:text="Reset Info" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentBottom="true" 
    android:layout_centerHorizontal="true" 
    android:layout_marginBottom="181dp" 
    android:id="@+id/resetButton" /> 



<TextView 
    android:text="999" 
    android:textSize="100dp" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:id="@+id/speedText" 
    android:layout_alignParentTop="true" 
    android:layout_centerHorizontal="true" 
    android:layout_marginTop="100dp" /> 

<TextView 
    android:text="Km/h" 
    android:textSize="25dp" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:id="@+id/unitText" 
    android:layout_below="@+id/speedText" 
    android:layout_centerHorizontal="true" /> 

<Button 
    android:text="Start" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentBottom="true" 
    android:layout_alignParentStart="true" 
    android:layout_marginStart="24dp" 
    android:layout_marginBottom="65dp" 
    android:id="@+id/startButton" /> 

這是日誌deployng當我得到:執行時

E/AndroidRuntime: FATAL EXCEPTION: main 
       Process: com.amp.systems.performancespeedometer, PID: 4090 
       java.lang.RuntimeException: Unable to start activity ComponentInfo{com.amp.systems.performancespeedometer/com.amp.systems.performancespeedometer.Speedometer}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)' on a null object reference 
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2665) 
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2726) 
        at android.app.ActivityThread.-wrap12(ActivityThread.java) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1477) 
        at android.os.Handler.dispatchMessage(Handler.java:102) 
        at android.os.Looper.loop(Looper.java:154) 
        at android.app.ActivityThread.main(ActivityThread.java:6119) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776) 
       Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)' on a null object reference 
        at com.amp.systems.performancespeedometer.Speedometer.enableButtons(Speedometer.java:160) 
        at com.amp.systems.performancespeedometer.Speedometer.onCreate(Speedometer.java:154) 
        at android.app.Activity.performCreate(Activity.java:6679) 
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118) 
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2618) 
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2726)  
        at android.app.ActivityThread.-wrap12(ActivityThread.java)  
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1477)  
        at android.os.Handler.dispatchMessage(Handler.java:102)  
        at android.os.Looper.loop(Looper.java:154)  
        at android.app.ActivityThread.main(ActivityThread.java:6119)  
        at java.lang.reflect.Method.invoke(Native Method)  
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)  
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)  


<?xml version="1.0" encoding="utf-8"?> 

<android.support.design.widget.AppBarLayout 
    android:id="@+id/appbar" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:paddingTop="@dimen/appbar_padding_top" 
    android:theme="@style/AppTheme.AppBarOverlay"> 

    <android.support.v7.widget.Toolbar 
     android:id="@+id/toolbar" 
     android:layout_width="match_parent" 
     android:layout_height="?attr/actionBarSize" 
     android:background="?attr/colorPrimary" 
     app:layout_scrollFlags="scroll|enterAlways" 
     app:popupTheme="@style/AppTheme.PopupOverlay"> 

    </android.support.v7.widget.Toolbar> 

</android.support.design.widget.AppBarLayout> 

<android.support.v4.view.ViewPager 
    android:id="@+id/container" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    app:layout_behavior="@string/appbar_scrolling_view_behavior" /> 

<android.support.design.widget.FloatingActionButton 
    android:id="@+id/fab" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_gravity="end|bottom" 
    android:layout_margin="@dimen/fab_margin" 
    app:srcCompat="@android:drawable/ic_dialog_email" /> 

該應用程序只是崩潰。

在此先感謝! :)

+0

你可以發佈完整的'activity_speedometer.xml'嗎? – MohanadMohie

回答

0

貌似是startButton爲null,因爲它不存在於activity_speedometer.xml

+0

我以前沒有見過activity_speedometer.xml。該項目只打開speedometer_fragment.xml,但它們看起來是一樣的,我應該把代碼從片段移動到activity.xml嗎? – AlePirchi

+0

在這種情況下,您應該使用片段類中的onCreateView將視圖與所需的事件綁定。你必須像這樣膨脹你的佈局View rootView = inflater.inflate(R.layout.speedometer_fragment.xml,container,false); 。然後你可以做到這一點startButton =(Button)rootView.findViewById(R.id.startButton); –

+0

我現在就試試吧!謝謝 – AlePirchi

0

哪裏是哪裏聲明id爲XML:

FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); 

我想你可能會缺少ID,或者您的ID有不同的名稱。

問候

+0

我剛剛上傳它,它的activity_speedometer.xml – AlePirchi

相關問題