2017-08-10 56 views
0

我想要如果用户输入一个无效的数字,两个TextView s应该改变他们的文本。
我抬起头,检查是否有一个以上的TextView带有相同的ID,而且我的TextView中的每个ID都是唯一的。为什么我的TextViews为空?

每当我输入一个无效数字强制我的错误我的应用程序崩溃。如果我在调试中启动应用程序并标记我的两个“有问题的代码”。结果是TextView s是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();但我我得到了两个问题:
1.为什么我应该使用,如果我不chnage我的布局?
2.我试了一下,我的应用程序没有崩溃,但我的文本没有改变。 (setContentView();setText();"之前使用的,使用)

这里是我的整个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) 

编辑:

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; 
} 

其他一切(abput的代码4K行)的arent重要

+0

你能发布全班吗?我想知道何时调用errorKnowledge方法,以及是否已经在onCreate方法中运行了setContentView。 – instantiator

+0

来自您的日志它说你在“onClick”有问题 – Salman500

+0

@instantiator我更新了我的代码。你去 – user8442416

回答

0

在您的onCreate(),您必须致电setContentView(R.layout.whateveryourxml)。之后,但仍然可以追溯到您的onCreate,您可以拨打errorKnowledge()。这应该确保TextView都不为null。

+0

我更新了我的问题,我认为我不需要在我的'onCreate();'方法中做某事。 – 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); 

我也建议你花一些时间在你onCreate方法做所有的findView工作,这样你就不需要稍后再做一遍。 (它也更清楚一些,并且可以节省很多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); 
    ... 
} 

已经做到了这一点,那么你可以参考两个TextViews从其他地方在您的就像他们的成员一样:知识和知识;

+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