Android 执行期间未找到文本视图

Android text view not found during execution time

我有一个必须在执行时更新的文本视图。此文本视图由以下 xml 定义:

<TextView
android:id="@+id/agi_val"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="TextView" />

在 activity 代码中,我像这样访问这个(和其他 TextView):

private TextView AGI;
///< Some stuff

 protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_abf__char_gen__basic_info);

        abfToolsSaveData = (ABFToolsSaveData) getIntent().getParcelableExtra("SaveDataClass");

        this.AGI = (TextView) findViewById(R.id.agi_val);
        ///< Some stuff

        if (abfToolsSaveData != null) {
            this.chargeData(true);
        } else {
            Log.d("INFO", "abfToolsSaveData is null");
        }
    }

然后,在 chargeData(boolean):

public void chargeData(boolean firstTime){
        if(firstTime){
            MainCharacteristics mc = abfToolsSaveData.getCharacter().getMainCharacteristics(); ///< We get the main characteristics, auto-generated the first time

            /**
             * Set the Text Views with the default value
             */
            if(AGI != null){    ///< I've done this to check if the text view is null or not
                Log.d("INFO", String.valueOf(AGI));
                AGI.setText(mc.getAGI());
            }
            else
                Log.d("INFO","AGI IS NULL");
            ///< Some stuff
        }
    }

问题是正在找到 "agi_val" 文本视图,但是我之前保存的 activity 的 AGI 文本视图无法访问资源 "agi_val"谁的链接。错误日志如下:

///< This first line shows the value of the "agi_val" ID. As you can see, it's not null.
    09-20 10:07:32.344 1266-1266/com.noeselmastersonlosdados.sliferdragon.penandpapercompanion D/INFO: android.support.v7.widget.AppCompatTextView{b670993 V.ED.... ......ID 0,0-0,0 #7f0d0077 app:id/agi_val}
    09-20 10:07:32.344 1266-1266/com.noeselmastersonlosdados.sliferdragon.penandpapercompanion W/ResourceType: No package identifier when getting value for resource number 0x00000009
    --------- beginning of crash
    09-20 10:07:32.347 1266-1266/com.noeselmastersonlosdados.sliferdragon.penandpapercompanion E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.noeselmastersonlosdados.sliferdragon.penandpapercompanion, PID: 1266
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.noeselmastersonlosdados.sliferdragon.penandpapercompanion/com.noeselmastersonlosdados.sliferdragon.penandpapercompanion.ABF_CharGen_BasicInfo}: android.content.res.Resources$NotFoundException: String resource ID #0x9
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2325)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)
    at android.app.ActivityThread.access0(ActivityThread.java:151)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:135)
    at android.app.ActivityThread.main(ActivityThread.java:5254)
    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:903)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
  Caused by: android.content.res.Resources$NotFoundException: String resource ID #0x9
    at android.content.res.Resources.getText(Resources.java:299)
    at android.widget.TextView.setText(TextView.java:4132)
///< This line is the assigment of the text
    at com.noeselmastersonlosdados.sliferdragon.penandpapercompanion.ABF_CharGen_BasicInfo.chargeData(ABF_CharGen_BasicInfo.java:73)
    at com.noeselmastersonlosdados.sliferdragon.penandpapercompanion.ABF_CharGen_BasicInfo.onCreate(ABF_CharGen_BasicInfo.java:54)
    at android.app.Activity.performCreate(Activity.java:5990)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387) 
    at android.app.ActivityThread.access0(ActivityThread.java:151) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:135) 
    at android.app.ActivityThread.main(ActivityThread.java:5254) 
    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:903) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 

有人知道到底发生了什么吗?我已经花了两天时间试图解决这个问题,但我不知道如何解决(我在互联网上搜索过,但我找不到类似的东西)。

如果有人要 R class ID,它与日志中第一行显示的相同。

调用 setContentView() 后,如果您在正确的布局中查找并且视图存在于该布局中,您将永远不会得到空视图。

如果您通过传递错误的 ID 查找视图,您只会得到一个空值

使用这个 if (!AGI.getText().toString.matches(""))

或这个

if(!TextUtils.isEmpty(AGI.getText().toString))

代替 if(AGI != null)

我认为您不需要使用 this 来引用在 XML 中查找 TextView 小部件 ID。

所以,只需这样做:

TextView AGI = (TextView) findViewById(R.id.agi_val);

您也可以通过 isEmpty() 函数检查该值是否为空。您必须检查 abfToolsSaveData 而不是 AGI 的空值。还要检查 abfToolsSaveData 的类型。如果它 integerdouble,那么你必须将 integer/double 值解析为 string.

if(!abfToolsSaveData.isEmpty()){
    AGI.setText("Some Text");
    //AGI.setText(String.valueOf("some integer content"));

}else {

}

嗯,我在 "Stack Overflow en Español" 中问过同样的答案,我得到了答案。

问题是 mc.getAGI() 返回一个 int,因此使用 setText(int resourceId) 的覆盖,找到具有 id 值的资源 R.string .

Link 到答案:https://es.whosebug.com/a/103616/6568