简体   繁体   中英

Android App OnClick Crashing

So i have a simple app, just a menu with a few buttons, when a button is clicked you are brought to a new page. The page has a button, which when clicked, keeps changing its background image until it runs out of images (list of image names stored in strings), then you are brought back to the main menu. I can do this twice, then on the third attempt, if i click a button on the menu the app crashes. This doesnt happen on the emulator, only when i run it on my phone. I dont know why this is happening

在此处输入图片说明

package com.example.otapp;

import com.example.otapp.R.raw;

import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.util.DisplayMetrics;
import android.view.Display;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.LinearLayout;
import android.widget.LinearLayout.LayoutParams;
import android.media.MediaPlayer;

public class MainActivity extends ActionBarActivity {

    public static String DPExtension;//Holds the letters dp
    public String list;
    public static int Screen_Height;//holds screen height
    public static int Screen_Width;//holds screen width
    public Intent intent;
    public MediaPlayer audio;

    public final static String EXTRA_MESSAGE = "com.example.otapp.MESSAGE";

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //this code block is for getting the screen proportions
        Display getdisplay = getWindowManager().getDefaultDisplay();
        DisplayMetrics dispMetrics = new DisplayMetrics();
        getdisplay.getMetrics(dispMetrics);

        float densitydp  = getResources().getDisplayMetrics().density;

        float ScreenHeightdp = dispMetrics.heightPixels / densitydp;
        float ScreenWidthdp  = dispMetrics.widthPixels / densitydp;

        //Below dimension value holders do not use pixel density
        float ScreenHeightCheck = dispMetrics.heightPixels;
        float ScreenWidthCheck = dispMetrics.heightPixels;

        DPExtension = "dp";

        Screen_Height = (int) ScreenHeightCheck;

        Screen_Width = (int) ScreenWidthCheck;

        //The printlns are so I can discern the outputs in LogCat
        //System.out.println("Screen Height:" + Screen_Height);
        //System.out.println("Screen Width:" + Screen_Width);

        View Button1 = findViewById(R.id.Button01);
        LinearLayout.LayoutParams params = (LayoutParams) Button1.getLayoutParams();
        params.height = Screen_Height/3;
        Button1.setLayoutParams(params);

        View Button2 = findViewById(R.id.Button02);
        Button2.setLayoutParams(params);

        View Button3 = findViewById(R.id.Button03);
        Button3.setLayoutParams(params);

        View Button4 = findViewById(R.id.Button04);
        Button4.setLayoutParams(params);

        Button1.setOnClickListener(onClickListener);
        Button2.setOnClickListener(onClickListener);
        Button3.setOnClickListener(onClickListener);
        Button4.setOnClickListener(onClickListener);

        Button1.setBackgroundResource(getResources().getIdentifier("gettingup", "drawable", getPackageName()));

        intent = new Intent(this, DisplayMessageActivity.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

        audio = MediaPlayer.create(MainActivity.this, raw.buttonsound);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {

        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    private OnClickListener onClickListener = new OnClickListener() {

        @Override
        public void onClick(View v) {

            // play sound
            audio.start();

            // do different things for each different button
            switch(v.getId()) {
                case R.id.Button01:

                    list = "Get Up";

                    intent.putExtra(EXTRA_MESSAGE, list);

                    startActivity(intent);

                    break;
                case R.id.Button02:

                    list = "Get Dressed";

                    intent.putExtra(EXTRA_MESSAGE, list);

                    startActivity(intent);

                    break;
                case R.id.Button03:

                    list = "Get Dressed";

                    intent.putExtra(EXTRA_MESSAGE, list);

                    startActivity(intent);

                    break;
                case R.id.Button04:

                    list = "Get Dressed";

                    intent.putExtra(EXTRA_MESSAGE, list);

                    startActivity(intent);

                    break;
            }   
        }
    };

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
}

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent" android:layout_height="match_parent" android:background="#1E90FF">

    <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">

        <Button
            android:id="@+id/Button01"
            android:layout_width="match_parent"
            android:layout_height="125dp"
            android:text="@string/button_send"/>

        <Button
            android:id="@+id/Button03"
            android:layout_width="match_parent"
            android:layout_height="125dp"
            android:text="@string/button2_send" />

        <Button
            android:id="@+id/Button04"
            android:layout_width="match_parent"
            android:layout_height="125dp"
            android:text="@string/button3_send" />

        <Button
            android:id="@+id/Button02"
            android:layout_width="match_parent"
            android:layout_height="125dp"
            android:text="@string/button4_send" />

    </LinearLayout>

</ScrollView>

Try moving the definition of the onClickListener object into the onCreate method. You can declare it as a member variable, but you should create the object and assign it to the field in onCreate()

If the source above is formatted correctly, line 99, which is where the NullPointerException is thrown, is:

 audio.start();

This means that audio is null. It is declared on line 83:

 audio = MediaPlayer.create(MainActivity.this, raw.buttonsound);

Most likely what's happening is that the MediaPlayer.create is unable to located the raw.buttonsound. I'd debug at this line and verify that the MediaPlayer is failing to create the audio.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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