0

我制作了一个应用程序,由用户选择动态生成 EditText 字段,并从中获取文本。这就是我设置我的 EditText 字段的方式:用户从微调器中选择选项,EditText 字段出现他想要的参数。EditText ID 是行号是微调器。我的代码中的“字段”参数已经在程序请求时声明。编码:

public void setTheEditTextFiled(View rowNumber, LinearLayout linearLayout, EditText field, LayoutParams b){
    field = new EditText(this);
    field.setLayoutParams(b);
    field.setId(parametersChoose.getPositionForView(rowNumber));
    linearLayout.addView(field);

}

这似乎工作正常,我得到了我想要他的 EditText 字段。现在我想通过按下“保存”按钮来获取用户输入的文本并将其放入数据库中。这是我的代码:

public void onClick(View v) {

    switch(v.getId())
     {
    case R.id.addWorkOut:
     {
         String exercise;
         String weight = "";
         String reps = "";


        try{
        if(findViewById(0) != null)
            weight = myWeight.getText().toString();
        if(findViewById(1) != null)
            reps = myReps.getText().toString();
        }
        catch (Exception e){

            Toast.makeText(this, "bad", Toast.LENGTH_SHORT).show();
        }

        exercise = addNewExercise.getText().toString();
        date = getIntent().getExtras();

        if(exercise.equals("") == false)
            exercise = addNewExercise.getText().toString();
        else
            exercise = workOutChoose.getSelectedItem().toString();

        DataBaseMain data = new DataBaseMain(this);
        data.open();
        data.createEntry(date.getString("date"), exercise, weight, reps);
        data.close();
                    break;

}

我也试着这样称呼它:

if( (EditText) findViewById(0) != null)

但它现在正在工作。

这里的奇怪之处,就是用来工作的。突然它不,我不知道为什么,我得到了这个 logcat 错误:

 05-07 20:00:45.159: E/AndroidRuntime(2045): FATAL EXCEPTION: main
05-07 20:00:45.159: E/AndroidRuntime(2045): java.lang.NullPointerException
05-07 20:00:45.159: E/AndroidRuntime(2045):     at com.example.workoutlog.AddWorkOutPage.onClick(AddWorkOutPage.java:112)
05-07 20:00:45.159: E/AndroidRuntime(2045):     at android.view.View.performClick(View.java:4204)
05-07 20:00:45.159: E/AndroidRuntime(2045):     at android.view.View$PerformClick.run(View.java:17355)
05-07 20:00:45.159: E/AndroidRuntime(2045):     at android.os.Handler.handleCallback(Handler.java:725)
05-07 20:00:45.159: E/AndroidRuntime(2045):     at android.os.Handler.dispatchMessage(Handler.java:92)
05-07 20:00:45.159: E/AndroidRuntime(2045):     at android.os.Looper.loop(Looper.java:137)
05-07 20:00:45.159: E/AndroidRuntime(2045):     at android.app.ActivityThread.main(ActivityThread.java:5041)
05-07 20:00:45.159: E/AndroidRuntime(2045):     at java.lang.reflect.Method.invokeNative(Native Method)
05-07 20:00:45.159: E/AndroidRuntime(2045):     at java.lang.reflect.Method.invoke(Method.java:511)
05-07 20:00:45.159: E/AndroidRuntime(2045):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
05-07 20:00:45.159: E/AndroidRuntime(2045):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
05-07 20:00:45.159: E/AndroidRuntime(2045):     at dalvik.system.NativeStart.main(Native Method)

这一行日志猫(AddWorkOutPage.java:112):

 com.example.workoutlog.AddWorkOutPage.onClick(AddWorkOutPage.java:112)

是代码中的这一行:

weight = myWeight.getText().toString();

他得到的一些方法是ID。

另一件事,我认为我的 EditText 字段的 ID 设置存在问题。但是我有另一种方法可以通过它自己的 ID 删除 EditText 字段,并且此方法有效。所以 EditText 字段的 ID 似乎没问题。

我试图投影->清理。试图删除 R.java。试图安装/卸载应用程序。没有任何帮助。

我检查了没有重复 ID 的 XML 代码,这是我的 XML 代码:

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    xmlns:android="http://schemas.android.com/apk/res/android">

     <Button
         android:id="@+id/addWorkOut"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:text="save" />

     <Button
         android:id="@+id/update"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:text="update" />

     <TextView
         android:id="@+id/textView1"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:text="Set new Exercise type or choose from the lsit below" />


     <EditText
         android:id="@+id/newExercise"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:ems="10" >

     </EditText>

     <Spinner
         android:id="@+id/workOutChoose"
         android:layout_width="match_parent"
         android:layout_height="wrap_content" />

     <Spinner
         android:id="@+id/parametersChoose"
         android:layout_width="match_parent"
         android:layout_height="wrap_content" />

        <ScrollView
            android:id="@+id/scroll"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content" >

            <LinearLayout
                android:id="@+id/test"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:orientation="vertical" >



            </LinearLayout>

         </ScrollView>



   ></LinearLayout>

感谢您的帮助:)

4

3 回答 3

0

添加如下内容:

        EditText weight = (EditText)findViewByID(R.id.myWeight);

您需要引用EditText的 id 。

于 2013-05-07T20:18:41.437 回答
0

是什么findViewByID(0)

当您将组件添加到布局时,ID 由 R 文件自动生成。

因此,您需要将 ID:'myWeight" 添加到您的布局 EditText 并通过以下方式获取它:

EditText weight = (EditText)findViewByID(R.id.myWeight);

不建议通过某个数字来获取视图。它会给您一个错误,或者 ID 将与正确的组件无关。看,现在,当你写0 时findViewById(0),0 可以与任何东西相关,比如布局中的按钮。所以这就是为什么人们使用R.id.someIDR 文件匹配你在布局中提供的 Id 名称与一些整数之间的原因。通过这种方式,您可以防止错误,就像您现在所做的那样(它不会为您提供正确的组件)

于 2013-05-07T20:13:48.537 回答
-1

那么我设法解决它。对于在应用程序中处理动态字段的任何人,这里是解决方案。感谢谁帮助了我,这是解决方案:我只需要在 myWeight 上找到 if 语句之外的 ID。:)

...
...

 myWeight = (EditText) findViewById(0);
 myReps = (EditText) findViewById(1);


        if(myWeight != null)
            weight = myWeight.getText().toString();
        if(myReps != null)
            reps = myReps.getText().toString();

...
...
于 2013-05-08T05:28:26.427 回答