【问题标题】:Why are my TextViews null?为什么我的 TextViews 为空?
【发布时间】:2017-08-10 00:15:56
【问题描述】:

如果用户输入无效号码,我希望两个TextViews 应该更改他们的文本。
我查看并检查是否有多个具有相同 ID 的 TextView,结果是我的 TextViews 中的每个 ID 都是唯一的。

每次我输入无效号码时,我的应用程序都会崩溃。如果我在调试中启动应用程序并标记我的两个“有问题的代码”。结果是 TextViews 和 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. 如果我不更改布局,为什么要使用它?
2. 我试过了,我的应用程序没有崩溃,但我的文本没有改变。 (setContentView(); 在使用 setText();" 之前使用)

这是我的整个错误报告(没有调试过程):

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

其他一切(大约 4k 行代码)都不重要

 

【问题讨论】:

  • 你能发布全班吗?我想了解何时调用 errorKnowledge 方法,以及您是否在 onCreate 方法中运行了 setContentView。
  • 从您的日志中说您在“onClick”上遇到问题
  • @instantiator 我更新了我的代码。给你
  • @Salman500 Idk 为什么,因为我使用了我的checkingInput 方法,而我的按钮得到了这个onClick 方法。我不知道为什么会有什么问题
  • 什么无效的号码。你要输入吗?

标签: java android methods widget


【解决方案1】:

在您的onCreate() 中,您必须致电setContentView(R.layout.whateveryourxml)。在那之后,但仍然可以追溯到您的 onCreate,您可以调用 errorKnowledge()。这应该确保两个 TextView 都不为空。

【讨论】:

  • 我更新了我的问题,我认为我不需要在我的onCreate(); 方法中做某事。
【解决方案2】:

[编辑:澄清一下,您确实必须在 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);

您没有看到任何效果的原因是这些是返回一些值的 get 语句,但是您实际上并没有使用这些值来任何事情。

我觉得你真正想说的是:

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 个 TextView:

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

完成此操作后,您就可以在班级的其他任何地方引用这两个 TextView,就像它们的成员一样:hKnowledge 和 tKnowledge;

【讨论】:

  • 对您的编辑的一个问题:我的“开始”布局是“activity_main”,并且有一个按钮可以将 contentView 更改为“testwissenstand”。那么为什么我需要在我的onCreate 方法中这样做呢?如果我使用多个setContentView,我认为它只会使用最后一个
  • 我想这是可能的,尽管动态更改布局的推荐方法似乎是使用片段。片段有复杂的生命周期,所以我建议阅读它们。您可以自己手动填充视图,然后在适当的视图上设置各种按钮等,即。如果您创建一个视图view1 = getLayoutInflater().inflate(R.layout.layout1, null);,那么您可以像button1 = view1.findViewById(R.id.button_1); 这样在其中找到您的按钮,然后您可以根据自己的喜好setContentView(view1);(或任何其他视图)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-04
  • 2018-06-26
  • 2010-11-25
  • 2018-04-07
  • 2015-02-22
  • 2017-12-07
  • 2010-12-14
相关资源
最近更新 更多