2017-08-10 5 views
0

ユーザーが無効な番号を入力した場合は、2つのTextViewがテキストを変更する必要があります。
TextViewと同じidを持つ人が見つかった場合は、私はTextViewの各IDが一意であるということを調べました。なぜ私のTextViewsはnullですか?

毎回、無効な番号を入力するとエラーが発生し、アプリがクラッシュします。私がデバッグでアプリケーションを起動し、私の2つの "問題のあるコード"をマークした場合。結果はTextViewであり、nullであった。
IDが一意で、現在のレイアウトが変更されないため、なぜこのようなことが起こるのかわかりません。

私のJavaコード:

public void checkingInput(View view) { 
    TextView eKnowledge = (TextView) findViewById(R.id.enterKnowledge); 

    try{ 
     int inputNumber = Integer.parseInt(eKnowledge.getText().toString()); 
     _knowledge = KnowledgeLevel.fromUserInput(inputNumber); 
     test(); 
     hideKeyboard(view); 
    } catch(NumberFormatException e){ 
     errorKnowledge(); 
     hideKeyboard(view); 
    } 
} 

@SuppressLint("SetTextI18n") 
public void test() { 
    setContentView(R.layout.test); 
    TextView test = (TextView) findViewById(R.id.textView_nur_einmal_benutzt_hoff_ich); 
    switch(_knowledge) { 
     case NOOB: 
      test.setText("ENUM = NOOB"); 
      break; 
     case BEGINNER: 
      test.setText("ENUM = BEGINNER"); 
      break; 
     case ADVANCED: 
      test.setText("ENUM = ADV"); 
      break; 
     case PRO: 
      test.setText("ENUM = PRO"); 
      break; 
     case GRANDMASTER: 
      test.setText("ENUM = GM"); 
      break; 
     case ERROR: 
      errorKnowledge(); 
      break; 
     case FAIL: 
      test.setText("FEHLER!"); 
      break; 
    } 
} 

@SuppressLint("SetTextI18n") 
public void errorKnowledge(){ 
    TextView hKnowledge = (TextView) findViewById(R.id.testWissenstandHeader); 
    TextView tKnowledge = (TextView) findViewById(R.id.testWissenstandText); 

    /* da ist der fehler ... einmal mit dem debugger durch zeigt es doch direkt: hKnowledge und tKnowledge sind null, daher die NullPointerException */ 

    hKnowledge.getResources().getString(R.string.FehlerGefunden); 
    hKnowledge.getResources().getColor(android.R.color.holo_red_dark); 
    tKnowledge.getResources().getString(R.string.FehlerText1); 
    tKnowledge.getResources().getColor(android.R.color.holo_red_light); 
} 

private enum KnowledgeLevel { 
    FAIL, ERROR, NOOB, BEGINNER, ADVANCED, PRO, GRANDMASTER; 

    static KnowledgeLevel fromUserInput(final int input) 
    { 
     if (input >= 11 || input <= -1) { 
      return ERROR; 
     } 
     else if (input == 10) { 
      return GRANDMASTER; 
     } 
     else if (input >= 7) { 
      return PRO; 
     } 
     else if (input >= 4) { 
      return ADVANCED; 
     } 
     else if (input >= 1) { 
      return BEGINNER; 
     } 
     else if (input == 0) { 
      return NOOB; 
     } 
     return FAIL; 
    } 
} 

そして、私のXML:

<TextView 
    android:id="@+id/testWissenstandHeader" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_marginBottom="8dp" 
    android:layout_marginStart="8dp" 
    android:layout_marginEnd="8dp" 
    android:layout_marginTop="8dp" 
    android:text="Bla" 
    android:textAlignment="center" 
    android:textColor="#511613" 
    android:textSize="32sp" 
    android:textStyle="bold" 
    app:layout_constraintBottom_toBottomOf="@+id/kastenKnowledge" 
    app:layout_constraintLeft_toLeftOf="@+id/kastenKnowledge" 
    app:layout_constraintRight_toRightOf="@+id/kastenKnowledge" 
    app:layout_constraintTop_toTopOf="@+id/kastenKnowledge"/> 

<TextView 
    android:id="@+id/testWissenstandText" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_marginEnd="16dp" 
    android:layout_marginStart="16dp" 
    android:layout_marginTop="16dp" 
    android:text='BlaBla' 
    android:textAlignment="center" 
    android:textColor="#E0E0E0" 
    android:textSize="20sp" 
    app:layout_constraintHorizontal_bias="0.512" 
    app:layout_constraintLeft_toLeftOf="parent" 
    app:layout_constraintRight_toRightOf="parent" 
    app:layout_constraintTop_toBottomOf="@+id/testWissenstandHeader"/> 

私は少しを調査し、私はstackoverflow.com上で見つけた唯一の解決策は、私はsetContentView();を使用する必要があるが、私は」ということでした私はそれに2つの問題があります:
1.レイアウトを変更しない場合、なぜそれを使用しますか?
2.私はそれを試して、私のアプリはクラッシュしませんでしたが、私のテキストは変更されませんでした。 (setText();"が使用される前setContentView();が使用された)

はここに私の全体のerrorreport(なしデバッグprozess)です:

08-10 00:14:53.580 2774-2774/com.example.alexander.hashtagnevereverbuggy E/AndroidRuntime: FATAL EXCEPTION: main 
                         Process: com.example.alexander.hashtagnevereverbuggy, PID: 2774 
                         java.lang.IllegalStateException: Could not execute method for android:onClick 
                          at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:293) 
                          at android.view.View.performClick(View.java:4756) 
                          at android.view.View$PerformClick.run(View.java:19749) 
                          at android.os.Handler.handleCallback(Handler.java:739) 
                          at android.os.Handler.dispatchMessage(Handler.java:95) 
                          at android.os.Looper.loop(Looper.java:135) 
                          at android.app.ActivityThread.main(ActivityThread.java:5221) 
                          at java.lang.reflect.Method.invoke(Native Method) 
                          at java.lang.reflect.Method.invoke(Method.java:372) 
                          at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) 
                          at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) 
                         Caused by: java.lang.reflect.InvocationTargetException 
                          at java.lang.reflect.Method.invoke(Native Method) 
                          at java.lang.reflect.Method.invoke(Method.java:372) 
                          at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288) 
                          at android.view.View.performClick(View.java:4756)  
                          at android.view.View$PerformClick.run(View.java:19749)  
                          at android.os.Handler.handleCallback(Handler.java:739)  
                          at android.os.Handler.dispatchMessage(Handler.java:95)  
                          at android.os.Looper.loop(Looper.java:135)  
                          at android.app.ActivityThread.main(ActivityThread.java:5221)  
                          at java.lang.reflect.Method.invoke(Native Method)  
                          at java.lang.reflect.Method.invoke(Method.java:372)  
                          at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)  
                          at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)  
                         Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.Resources android.widget.TextView.getResources()' on a null object reference 
                          at com.example.alexander.hashtagnevereverbuggy.MainActivity.errorKnowledge(MainActivity.java:112) 
                          at com.example.alexander.hashtagnevereverbuggy.MainActivity.test(MainActivity.java:97) 
                          at com.example.alexander.hashtagnevereverbuggy.MainActivity.checkingInput(MainActivity.java:68) 
                          at java.lang.reflect.Method.invoke(Native Method)  
                          at java.lang.reflect.Method.invoke(Method.java:372)  
                          at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288)  
                          at android.view.View.performClick(View.java:4756)  
                          at android.view.View$PerformClick.run(View.java:19749)  
                          at android.os.Handler.handleCallback(Handler.java:739)  
                          at android.os.Handler.dispatchMessage(Handler.java:95)  
                          at android.os.Looper.loop(Looper.java:135)  
                          at android.app.ActivityThread.main(ActivityThread.java:5221)  
                          at java.lang.reflect.Method.invoke(Native Method)  
                          at java.lang.reflect.Method.invoke(Method.java:372)  
                          at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)  
                          at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) 

はEDIT:

package com.example.alexander.hashtagnevereverbuggy; 

import android.annotation.SuppressLint; 
import android.app.Fragment; 
import android.app.FragmentManager; 
import android.app.FragmentTransaction; 
import android.content.Context; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.text.Html; 
import android.view.View; 
import android.view.inputmethod.InputMethodManager; 
import android.widget.Button; 
import android.widget.ImageButton; 
import android.widget.ImageView; 
import android.widget.TextView; 

import java.util.HashMap; 

import com.google.android.gms.ads.AdRequest; 
import com.google.android.gms.ads.AdView; 
import com.google.android.gms.ads.MobileAds; 

import java.util.Map; 

@SuppressWarnings("deprecation") 
public class MainActivity extends AppCompatActivity implements Heroes { 

private KnowledgeLevel _knowledge = KnowledgeLevel.NOOB; 

private static FragmentManager _fragmentManager; 

private enum WerteTextFelder { 
    TITLE,TYP, DAMAGE, LADUNG, KUGELN, NACHLADEDAUER, HEILUNG, HEADSHOT, WIRKUNGSDAUER, EXTRAEFFEKT, BESONDERHEIT 
} 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    MobileAds.initialize(this, getString(R.string.AppID)); 

    _fragmentManager = getFragmentManager(); 

    Button testButtonAnfang = (Button) findViewById(R.id.AnfangsButton); 
    testButtonAnfang.setOnClickListener(new View.OnClickListener(){ 
     @Override 
     public void onClick(View v) { 
      setContentView(R.layout.testwissenstand); 
     } 
    }); 
} 

@Override 
public void onBackPressed() { 
    if(getFragmentManager().getBackStackEntryCount() > 0) { 
     getFragmentManager().popBackStack(); 
    } 
    super.onBackPressed(); 
} 

public void checkingInput(View view) { 
    TextView eKnowledge = (TextView) findViewById(R.id.enterKnowledge); 

    try{ 
     int inputNumber = Integer.parseInt(eKnowledge.getText().toString()); 
     _knowledge = KnowledgeLevel.fromUserInput(inputNumber); 
     test(); 
     hideKeyboard(view); 
    } catch(NumberFormatException e){ 
     errorKnowledge(); 
     hideKeyboard(view); 
    } 
} 

@SuppressLint("SetTextI18n") 
public void test() { 
    setContentView(R.layout.test); 
    TextView test = (TextView) findViewById(R.id.textView_nur_einmal_benutzt_hoff_ich); 
    switch(_knowledge) { 
     case NOOB: 
      test.setText("ENUM = NOOB"); 
      break; 
     case BEGINNER: 
      test.setText("ENUM = BEGINNER"); 
      break; 
     case ADVANCED: 
      test.setText("ENUM = ADV"); 
      break; 
     case PRO: 
      test.setText("ENUM = PRO"); 
      break; 
     case GRANDMASTER: 
      test.setText("ENUM = GM"); 
      break; 
     case ERROR: 
      errorKnowledge(); 
      break; 
     case FAIL: 
      test.setText("FEHLER!"); 
      break; 
    } 
} 

@SuppressLint("SetTextI18n") 
public void errorKnowledge(){ 
    TextView hKnowledge = (TextView) findViewById(R.id.testWissenstandHeader); 
    TextView tKnowledge = (TextView) findViewById(R.id.testWissenstandText); 

    /* da ist der fehler ... einmal mit dem debugger durch zeigt es doch direkt: hKnowledge und tKnowledge sind null, daher die NullPointerException */ 

    hKnowledge.getResources().getString(R.string.FehlerGefunden); 
    hKnowledge.getResources().getColor(android.R.color.holo_red_dark); 
    tKnowledge.getResources().getString(R.string.FehlerText1); 
    tKnowledge.getResources().getColor(android.R.color.holo_red_light); 
} 

private enum KnowledgeLevel { 
    FAIL, ERROR, NOOB, BEGINNER, ADVANCED, PRO, GRANDMASTER; 

    static KnowledgeLevel fromUserInput(final int input) 
    { 
     if (input >= 11 || input <= -1) { 
      return ERROR; 
     } 
     else if (input == 10) { 
      return GRANDMASTER; 
     } 
     else if (input >= 7) { 
      return PRO; 
     } 
     else if (input >= 4) { 
      return ADVANCED; 
     } 
     else if (input >= 1) { 
      return BEGINNER; 
     } 
     else if (input == 0) { 
      return NOOB; 
     } 
     return FAIL; 
    } 
} 

public static void addTransaction(Fragment fragment, String tag){ 
    if (_fragmentManager != null) { 
     FragmentTransaction fragmentTransaction = _fragmentManager.beginTransaction(); 
     fragmentTransaction.add(fragment, tag); 
     fragmentTransaction.addToBackStack(tag); 
     fragmentTransaction.commit(); 
    } 
} 

private void hideKeyboard(View view){ 
    InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); 
    imm.hideSoftInputFromWindow(view.getWindowToken(), 0); 
} 

private class geileListener implements View.OnClickListener{ 
    private Hero hero; 

    private geileListener (Hero hero) { 
     this.hero = hero; 
    } 

    @Override 
    public void onClick(View view) { 
     setContentView(hero.getHeroLayout()); 
    } 
} 

private void advertisment() { 
    /*Notwendig um advertisment im showlock darzustellen*/ 
    AdView mAdView = (AdView) findViewById(R.id.adView); 
    AdRequest adRequest = new AdRequest.Builder().build(); 
    mAdView.loadAd(adRequest); 
} 

public void showPreview (Hero hero) { 
    setContentView(hero.getPreviewLayout()); 
    ImageButton button = (ImageButton) findViewById(R.id.imageButton_Preview); 
    button.setImageResource(hero.getPreviewImage()); 
    button.setOnClickListener(new geileListener(hero)); 
    advertisment(); 
} 

private Map<WerteTextFelder, TextView> getWerteTextFelder() { 
    setContentView(R.layout.werte); 
    Map<WerteTextFelder, TextView> map = new HashMap<>(); 


    TextView Titel = (TextView) findViewById(R.id.textView_Überschrift); 
    TextView Typ = (TextView) findViewById(R.id.textView_Werte_0); 
    TextView Damage = (TextView) findViewById(R.id.textView_Wert_1); 
    TextView Ladung = (TextView) findViewById(R.id.textView_Wert_2); 
    TextView Kugeln = (TextView) findViewById(R.id.textView_Wert_3); 
    TextView Nachladedauer = (TextView) findViewById(R.id.textView_Wert_4); 
    TextView Heilung = (TextView) findViewById(R.id.textView_Wert_5); 
    TextView Headshot = (TextView) findViewById(R.id.textView_Wert_6); 
    TextView Wirkungsdauer = (TextView) findViewById(R.id.textView_Wert_7); 
    TextView ExtraEffekt = (TextView) findViewById(R.id.textView_Wert_8); 
    TextView wert9 = (TextView) findViewById(R.id.textView_Wert_9); 

    map.put(WerteTextFelder.TITLE, Titel); 
    map.put(WerteTextFelder.TYP, Typ); 
    map.put(WerteTextFelder.DAMAGE, Damage); 
    map.put(WerteTextFelder.LADUNG, Ladung); 
    map.put(WerteTextFelder.KUGELN, Kugeln); 
    map.put(WerteTextFelder.NACHLADEDAUER, Nachladedauer); 
    map.put(WerteTextFelder.HEILUNG, Heilung); 
    map.put(WerteTextFelder.HEADSHOT, Headshot); 
    map.put(WerteTextFelder.WIRKUNGSDAUER, Wirkungsdauer); 
    map.put(WerteTextFelder.EXTRAEFFEKT, ExtraEffekt); 
    map.put(WerteTextFelder.BESONDERHEIT, wert9); 

    return map; 
} 

(コードの4K行abput)他のすべてが重要なアレント

+0

クラス全体を公開できますか? errorKnowledgeメソッドが呼び出されたときと、onContentViewをonCreateメソッドで実行したかどうかを理解したいと思います。 – instantiator

+0

あなたのログからあなたは "onClick"に問題があると言っています – Salman500

+0

@instantiator私は自分のコードを更新しました。そこに – user8442416

答えて

0

あなたのonCreate()の場合は、setContentView(R.layout.whateveryourxml)に電話する必要があります。その後、まだあなたのonCreateに戻ってトレースすると、errorKnowledge()に電話することができます。これにより、どちらのTextViewもnullでないことを確認する必要があります。

+0

私の質問が更新されました。私は 'onCreate();'メソッドでsthを行う必要はないと思います。 – user8442416

0

[編集:明確にするために、を実行してください。は、onCreate中にsetContentViewメソッドを呼び出す必要があります。そうしないと、TextViewsはnullに解決されます。あなたが投稿したコードのようにそれをしたと仮定すると、読んでください!]

これらのコード行は私にとっては当てはまりません。彼らは何を行いますかのように見ていない:

hKnowledge.getResources().getString(R.string.FehlerGefunden); 
hKnowledge.getResources().getColor(android.R.color.holo_red_dark); 
tKnowledge.getResources().getString(R.string.FehlerText1); 
tKnowledge.getResources().getColor(android.R.color.holo_red_light); 

あなたは何の効果を見ていないしている理由は、これらのいくつかの値を返す文を取得していることですが、その後、あなたが実際ににこれらの値を使用していません何でも。

私はあなたが実際に言いたいように感じるがこれです:

hKnowledge.setText(R.string.FehlerGefunden); 
hKnowledge.setTextColor(android.R.color.holo_red_dark); 
tKnowledge.setText(R.string.FehlerText1); 
tKnowledge.setTextColor(android.R.color.holo_red_dark); 

あなたが必要としないように、私はまた、あなたがすべてのfindViewの仕事をして、あなたのonCreateメソッドでいくつかの時間を費やすことをお勧めします後でそれを何度もやり直す。 (これはまた、少し明確になり、定型的なjavaのかなりのビットを節約します)。

さまざまなTextView要素を定義することができます)クラスのプライベートメンバーとして、その - 例として、ちょうど我々はすでに話をしている2 TextViewsのために:

private TextView hKnowledge; 
private TextView tKnowledge; 
... 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    hKnowledge = (TextView) findViewById(R.id.testWissenstandHeader); 
    tKnowledge = (TextView) findViewById(R.id.testWissenstandText); 
    ... 
} 

これを行った、あなたは、どこか他のあなたの中から2 TextViewsを参照することができますhKnowledgeとtKnowledgeのメンバーとしてのクラス。

+0

あなたの編集に関する質問:私の "スタート"レイアウトは "activity_main"で、contentViewを "testwissenstand"に変更するボタンがあります。ではなぜ私は 'onCreate'メソッドでそれを行う必要がありますか? 複数の 'setContentView'を使用すると、最後のもののみを使用すると思います – user8442416

+0

レイアウトを動的に変更するには、Fragmentsを使用することをお勧めします。断片には複雑なライフサイクルがありますが、私はそれらを読み解くことをお勧めします。 ビューを手動で膨張させてから、さまざまなボタンなどを適切なビューに設定することができます。あなたがビュー 'view1 = getLayoutInflater()。inflate(R.layout.layout1、null);を作成すると、' button1 = view1.findViewById(R.id.button_1);のようにボタンを見つけることができます。 'setContentView(view1);'(または他のビューにも)好きなようにすることができます。 – instantiator

関連する問題