1

インスタンスを保存した後、いくつかの操作を行うために「int audio」を check() メソッドに共有する必要があります。「情報」オプションがあります。クリックすると情報ダイアログが表示され、音声を聞きたいです (「キャンセル」をクリックすると停止します)。しかし、エミュレーターを回転させると、別のオーディオ スターが表示されます。

int audio;
static int Info;

@Override
public void onCreate(Bundle savedInstanceState){ 
super.onCreate(savedInstanceState);
if (savedInstanceState != null) {
int Info = savedInstanceState.getInt("dialoginfo");
int audio = savedInstanceState.getInt("audio");
}

if(Info != 0)
  {
      Info();
}

private void Info(){
    Info = 1;
    sobCheck();
    LayoutInflater li = LayoutInflater.from(this);
    View view = li.inflate(R.layout.info, null);
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setView(view).create();
    TextView text=(TextView) findViewById(R.id.infoView1);
    builder.setCancelable(false); 
    builder.setPositiveButton("Chiudi", new DialogInterface.OnClickListener() {  
           public void onClick(DialogInterface dialog, int id) {  
               Info = 0;
               mp.stop();
               mp.reset();
               mp.release();
                mp = null;
                audio = 0;                  
               dialog.cancel();
        }  
        });  
    builder.show();
        }


private void sobCheck(){
if (audio == 0){
mp = MediaPlayer.create(this, R.raw.sob);
mp.start();
audio = 1;
}



protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt("audio", a);

画面を回転させた後、「オーディオ」は常に「0」です

4

3 に答える 3

3

問題は、ここでアプリケーション レベルの変数をシャドウするローカル スコープの変数を作成したことです。

    @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (savedInstanceState != null) {
        int Info = savedInstanceState.getInt("dialoginfo");
        int audio = savedInstanceState.getInt("audio");
    }

    if (Info != 0) {
        Info();
    }
}

これは、if チェックにスコープされ、直後に破棄される2 つの新しい変数Infoaudioを宣言して初期化します。onCreate メソッドの外部で宣言したアプリケーション レベルの変数は、実際には変更されません。これを次のように変更してみてください。

    @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (savedInstanceState != null) {
        Info = savedInstanceState.getInt("dialoginfo");
        audio = savedInstanceState.getInt("audio");
    }

    if (Info != 0) {
        Info();
    }
}

これにより、Infoaudioがローカル スコープで再宣言されるのを防ぎ、代わりに、既に宣言されている変数が初期化されます。

于 2012-12-07T21:54:08.190 に答える
1

onCreate() スコープの外で宣言する必要があります。

int audio;

@Override
public void onCreate(Bundle savedInstanceState){ 
    super.onCreate(savedInstanceState);
    if (savedInstanceState != null) {
        audio = savedInstanceState.getInt("audio");
}
于 2012-12-07T18:49:22.107 に答える
0

メソッド内で「オーディオ」を再初期化します。オーディオの値を割り当てる前に、「int」を取り出してください。

于 2012-12-07T19:10:28.243 に答える