3

多くのユーザーから NullPointerException が発生しましたが、問題が何であるかを特定できません。次の行でスローされます。

((Button)findViewById(R.id.speakEnglishButton)).setText("");

何が問題なのかわかりません。ボタンはその ID で存在し、正常にコンパイルされ、エミュレーターと 2 つのデバイスで正常に動作しますが、これに関するユーザーの開発者コンソールに約 100 ほどのエラーが投稿されています。バージョン。

onResume を詳しく見てみましょう:

@Override
protected void onResume()
{
    super.onResume();

    SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
    boolean isButtonLabelsEnabled = sp.getBoolean("isButtonLabelsEnabled", false);
    if (!isButtonLabelsEnabled)
    {
        ((Button)findViewById(R.id.speakEnglishButton)).setText("");
        ((Button)findViewById(R.id.speakFrenchButton)).setText("");
        ((Button)findViewById(R.id.speakSpanishButton)).setText("");
        ((Button)findViewById(R.id.speakGermanButton)).setText("");
        ((Button)findViewById(R.id.speakItalianButton)).setText("");
    }
    else
    {
        ((Button)findViewById(R.id.speakEnglishButton)).setText(getString(R.string.btnLblEnglish));
        ((Button)findViewById(R.id.speakFrenchButton)).setText(getString(R.string.btnLblFrench));
        ((Button)findViewById(R.id.speakSpanishButton)).setText(getString(R.string.btnLblSpanish));
        ((Button)findViewById(R.id.speakGermanButton)).setText(getString(R.string.btnLblGerman));
        ((Button)findViewById(R.id.speakItalianButton)).setText(getString(R.string.btnLblItalian));
    }
}

基本的に、保存された設定のブール値をチェックするだけで、その値に応じて、ボタンにラベルを設定するか、空白に設定します。

誰でもアドバイスできますか?

ありがとう

4

4 に答える 4

7

findViewById()ポイントは、ユーザーがアクティビティを再開したときにレイアウトが設定されていないため、検索する「アンカー」がなく、null を返すことだと思います。

呼び出しをsetContentView()からonCreateに移動するだけでかまいonResumeません ( のビューを参照していないことを前提としていますonCreate。通常の使用では、これは Android ライフサイクルのように違いはなく、ユーザーがアクティビティを操作できる前後にonResume直接呼び出されます。onCreate

実際、一部のアプリケーションにはバグがあり、アクティビティにアクセスしてから別のアクティビティを開始し、アプリを離れて別のアクティビティに移動し、戻ってから ([戻る] ボタンを使用して) 最初のアクティビティに戻ります。ここで突然、黒い画面が表示されます。これは、システムが最初のアクティビティを「スワップ」し、戻ったときに のみonResumeが呼び出され、 が呼び出されないonCreateためです。そのため、そこでレイアウトを再度ロードする機会がありません。

于 2012-01-26T20:36:38.030 に答える
3

これらすべてを行います ((Button)findViewById(R.id.speakEnglishButton)).setText(""); .... onCreate() で

追加

private Button mSpeakEngButton;
.....

クラス変数として、onCreate() で初期化します。

public void onCreate() {

   ....
   mSpeakEngButton = ((Button)findViewById(R.id.speakEnglishButton));
}

コードの後半で、mSpeakEngButton.setWhatever() として値を変更できます。

于 2012-01-26T21:09:35.933 に答える
2

最も可能性が高いのは、次の場合です。

((Button)findViewById(R.id.speakEnglishButton));

null を返します。これは、そのようなリソースが見つからない場合に発生します。自然に、1 つの理由が思い浮かびます。それは、レイアウトにデフォルトのリソースがないことです。つまり、「レイアウト」フォルダーに配置する必要がある各言語/方向/...に適用される「デフォルト」レイアウトが少なくとも1つ必要です。まさに「レイアウト」。

于 2012-01-26T20:36:08.060 に答える
-1

onCreate() の代わりに onResume() で setContentView() を保持すると、インフレ例外が発生します。私はこれを試しました。

于 2013-11-11T11:00:58.263 に答える