2012-01-26 7 views
3

それは、この行に投げられ、私は私のユーザー数から引き上げNullPointerExceptionが取得しています、と私は問題が何であるかを発見することができませんでしだ:Buttonを変更するときにonResumeのNullPointerExceptionが発生します。なぜですか?

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

私は見ることができませんよ私のエミュレータと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)); 
    } 
} 

、私がやっているすべては、保存された優先ブール値をチェックして、その値に応じて、私はどちらかのボタンにラベルを設定しています、またはそれらを設定します空白。

誰でも助言できますか?ほとんどの場合それはヌル

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

リターンを引き起こしています

おかげ

+0

すべてのレイアウトにこのボタンがありますか? –

+0

@ PeterKnego res/layout/languageselection.xmlには1つのレイアウトしかありません – Jimmy

答えて

3

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

public void onCreate() { 

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

その後のコードで、あなたがmSpeakEngButtonとしてその値を変更することができます)のonCreate(でそれらを初期化し、クラス変数として

private Button mSpeakEngButton; 
..... 

を追加します。setWhatever()

+0

完璧な、ちょうど私が行方不明だった、感謝! – Jimmy

+2

しかし、この問題が発生しています.. ?? –

+0

@MohitSharma私はそのように試みたことはありません。私は、私がそれらのいずれかを使用する必要があるときにルックアップを使用する代わりに、私が作業しているコントロールへの参照を持っていることを好みます。 – Maxim

2

。 このようなリソースが見つからない場合に発生します。 自発的に1つの理由が私の頭に浮かび上がっています。レイアウトにデフォルトのリソースがありません。 意味:には、少なくとも1つの「デフォルト」レイアウトが必要です。これは、各言語/オリエンテーションに適用され、「レイアウト」フォルダに配置する必要があります。単に "レイアウト"。

+0

これらのボタンが存在するレイアウトXMLファイルはres/layout/mylayout.xmlにありますので、デフォルトの権利ですか? – Jimmy

+0

@Michael:できませんでしたもっと詳しく説明できます –

+0

@MohitSharma私が作っている盲目的な推測は、 'layout.xml 'を' layout'フォルダに置くべきだということです。あなたは 'layout-de'、' layout-land'を持つかもしれませんが、単純に 'layout'という名前はありません。 – poitroae

6

私は、ユーザーがアクティビティを再開したときにレイアウトが設定されていないため、findViewById()には「アンカー」がないためにnullが返されるとは限りません。

あなたはちょうどあなたがonCreateでビューを参照していないことを考えるとonResume(へonCreateからsetContentView()への呼び出しを移動させることができる。これはAndroidのライフサイクルのように違いはありません通常の使用方法については、onResumeは直接onCreate後、ユーザーの前に呼び出されます

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

+0

これをどのように解決しますか? 'setContentView(R.layout.languageselection);'のようなonResumeでのコンテンツビューの設定? – Jimmy

+0

これは、アクティビティライフサイクルでは期待されていません。それは、いくつかのAndroidのチケットで対処されていますか? – Galya

+0

正直言って、私はこの答えが4年前だったので、詳細は思い出さない。私は実際にはこの時点でそれに遭遇し、それをデバッグしていたことを思い出します。チケットがあれば分かりません。それとも、新しいAndroidのバージョンでそれが固定されている場合。 –

-1

onContentView()をonCreate()ではなくonResume()にしておくと、inflate例外が発生します。これを試しました。

関連する問題