0

setText()を呼び出すメソッドがアクティビティ内にありますが、textViewでnullpointerexceptionが返されます。誰か教えてもらえますか?

スニペットについては、以下を参照してください。

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

..。

    songArtistAlbumLabel = (TextView) findViewById(R.id.songArtistAlbumLabel);

..。

static void displaySong(String currentArtist, String currentAlbum,
        String currentTitle, String totalDuration, Uri currentSongUri) {
    songArtistAlbumLabel.setText((currentArtist) + " - " + (currentAlbum));
        }

..。

さまざまな理由で、メソッドdisplaySongを静的に保つ必要があるため、

 songArtistAlbumLabel = (TextView) findViewById(R.id.songArtistAlbumLabel);

メソッドの内部..AFAIK。また、nullpointerexceptionは次の行で発生します

songArtistAlbumLabel.setText((currentArtist) + " - " + (currentAlbum));

メソッドの内部。

どんなアドバイスも大歓迎です。

- 編集 -

完全なコード:

package awesome.music.player;

import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.TextView;

public class MusicPlayer extends Activity implements OnSeekBarChangeListener {

    public ImageButton play;
    public ImageButton next;
    public ImageButton previous;

    public static ImageView albumArt;

    static TextView songArtistAlbumLabel;
    static TextView songTitleLabel;
    static TextView currentDurationLabel;
    static TextView totalDurationLabel;

    static String serviceStatus;

    private SeekBar seekBar;

    private int seekMax;

    boolean mBroadcastIsRegistered;

    public static Utilities utils;

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

        play = (ImageButton) findViewById(R.id.playButton);
        next = (ImageButton) findViewById(R.id.nextButton);
        previous = (ImageButton) findViewById(R.id.previousButton);
        albumArt = (ImageView) findViewById(R.id.imageView1);

        songArtistAlbumLabel = (TextView) findViewById(R.id.songArtistAlbumLabel);

        play.setOnClickListener(playListener);
        next.setOnClickListener(nextListener);
        previous.setOnClickListener(previousListener);



        seekBar = (SeekBar) findViewById(R.id.seekBar);
        seekBar.setOnSeekBarChangeListener(this);

        intent = new Intent(BROADCAST_SEEKBAR);

        if (mBroadcastIsRegistered != true) {
            registerReceiver(broadcastReceiver, new IntentFilter(
                    MusicService.BROADCAST_ACTION));;

            mBroadcastIsRegistered = true;
        }

    }

    private OnClickListener playListener = new OnClickListener() {
        public void onClick(View v) {
            MusicService.playSong();

        }
    };

    private OnClickListener nextListener = new OnClickListener() {
        public void onClick(View v) {
            MusicService.playNext();
        }
    };

    private OnClickListener previousListener = new OnClickListener() {
        public void onClick(View v) {
            MusicService.playPrevious();
        }
    };

    public static final String BROADCAST_SEEKBAR = "awesome.music.player.sendseekbar";
    Intent intent;

    private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent serviceIntent) {
            updateUI(serviceIntent);
        }
    };

    static void displaySong(String currentArtist, String currentAlbum,
            String currentTitle, String totalDuration, Uri currentSongUri) {



        songArtistAlbumLabel.setText(currentArtist + " - " + currentAlbum);

        songTitleLabel.setText(currentTitle);

        totalDurationLabel.setText(totalDuration);

        albumArt.setImageURI(currentSongUri);

    }

    private void updateUI(Intent serviceIntent) {
        String counter = serviceIntent.getStringExtra("counter");
        String mediamax = serviceIntent.getStringExtra("mediamax");
        String strSongEnded = serviceIntent.getStringExtra("song_ended");
        int seekProgress = Integer.parseInt(counter);
        seekMax = Integer.parseInt(mediamax);
        Integer.parseInt(strSongEnded);
        seekBar.setMax(seekMax);
        seekBar.setProgress(seekProgress);
    }

    public void onProgressChanged(SeekBar seekBar, int progress,
            boolean fromUser) {
        if (fromUser) {
            int seekPos = seekBar.getProgress();
            intent.putExtra("seekpos", seekPos);
            sendBroadcast(intent);
        }

    }

    public void onStartTrackingTouch(SeekBar seekBar) {
        // TODO Auto-generated method stub

    }

    public void onStopTrackingTouch(SeekBar seekBar) {
        // TODO Auto-generated method stub

    }

}

--編集2--

追加されたxml:

<?xml version="1.0" encoding="utf-8"?>
<AbsoluteLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

    <SeekBar
        android:id="@+id/seekBar"
        android:layout_width="296dp"
        android:layout_height="wrap_content"
        android:layout_marginBottom="20dp"
        android:layout_marginLeft="20dp"
        android:layout_marginRight="20dp"
        android:layout_x="10dp"
        android:layout_y="446dp"
        android:paddingLeft="6dp"
        android:paddingRight="6dp"
        android:progressDrawable="@drawable/seekbar_progress"
        android:thumb="@drawable/seek_handler" />

    <ImageView
        android:id="@+id/imageView2"
        android:layout_width="37dp"
        android:layout_height="37dp"
        android:layout_x="6dp"
        android:layout_y="397dp"
        android:src="@drawable/ic_tab_albums_white" />

    <TextView
        android:id="@+id/songTitleLabel"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_x="55dp"
        android:layout_y="395dp"
        android:text="Song Label"
        android:textSize="20sp" />

    <TextView
        android:id="@+id/songArtistAlbumLabel"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_x="55dp"
        android:layout_y="417dp"
        android:text="Artist - Album Label"
        android:textSize="15sp" />

    <TextView
        android:id="@+id/currentDurationLabel"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_x="10dp"
        android:layout_y="481dp"
        android:text="0:00" />

    <TextView
        android:id="@+id/totalDurationLabel"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_x="281dp"
        android:layout_y="477dp"
        android:text="3:30" />

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_x="41dp"
        android:layout_y="312dp"
        android:gravity="center_horizontal" >

        <ImageButton
            android:id="@+id/previousButton"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_x="132dp"
            android:layout_y="308dp"
            android:src="@drawable/ic_previous" />

        <ImageButton
            android:id="@+id/playButton"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="50sp"
            android:layout_marginRight="50sp"
            android:src="@drawable/ic_pause" />

        <ImageButton
            android:id="@+id/nextButton"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/ic_next" />
    </LinearLayout>

    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="287dp"
        android:layout_height="272dp"
        android:layout_x="16dp"
        android:layout_y="13dp"
        android:background="@drawable/dummy_album_art"
        android:scaleType="fitXY" />

</AbsoluteLayout>
4

2 に答える 2

2

nullpointerexceptionここでの主な問題ではありません。問題はあなたのデザインにあります。

displaySong()メソッドを静的にして、アクティビティの外部から呼び出すことができるようにします。使用TextView songArtistAlbumLabelするので、静的にする必要があります。ただし、静的フィールドはクラスインスタンスに属していないため、クラスに属しているため、これは設計上の大きな欠陥です。songArtistAlbumLabelただし、明らかにActivityインスタンスに属している必要があります。考えられるシナリオは次のとおりですdisplaySong()。Activityが起動されていないときにメソッドを呼び出すと、displaySongが起動されnullますnpe。別の考えられるシナリオを次に示します。displaySong()アクティビティが破棄さsongArtistAlbumLabelれて画面のどこにも表示されなくなった後に呼び出しますが、それでもラベルを設定しようとしています。

ダーティハックがあります-パブリックゲッターメソッド(シングルトンのようなもの)を使用して、Activityのインスタンスへの参照を別の静的フィールドに格納し、静的メソッドでそれを参照することができますfindViewById()。しかし、これは物事を改善するものではありません。

解決策は、インテントを使用して外部からアクティビティにメッセージを渡し、メソッドを介してメッセージをチェックインし、アクティビティのonNewIntent ()メソッドでそれらをリッスンすることです。onCreate()getIntent()

サービスからのみ呼び出す場合は編集してください。ビジーコーダーのAndroid開発ガイドのThe Music Playerセクションを確認してください。

于 2012-06-07T10:35:21.373 に答える
0

displaySong()設定後に呼び出すと仮定するとsongArtistAlbumLabel、最も可能性の高い説明はR.id.songArtistAlbumLabel、レイアウト内のどのIDとも一致しないということです。

于 2012-06-07T09:54:01.813 に答える