Android 如何编辑已动态添加的TextView?

Android 如何编辑已动态添加的TextView?,android,android-linearlayout,Android,Android Linearlayout,我目前正在开发一个计数器应用程序。通过按下“添加”按钮,可添加特定元素的新行。文本视图和2个按钮是其中的3个元素。我在文本视图编号的两侧各有两个按钮,当我按下左侧的按钮时,它会将一个按钮添加到文本视图中。这很好,但是当我动态添加新行时,当我按下按钮时,它会更改第一个动态添加行的值,而不是我单击按钮的行的值。它如何才能获得单击按钮后添加到该特定行的行。代码如下: 主要活动: public class MainActivity extends AppCompatActivity { pri

我目前正在开发一个计数器应用程序。通过按下“添加”按钮,可添加特定元素的新行。文本视图和2个按钮是其中的3个元素。我在文本视图编号的两侧各有两个按钮,当我按下左侧的按钮时,它会将一个按钮添加到文本视图中。这很好,但是当我动态添加新行时,当我按下按钮时,它会更改第一个动态添加行的值,而不是我单击按钮的行的值。它如何才能获得单击按钮后添加到该特定行的行。代码如下:

主要活动:

public class MainActivity extends AppCompatActivity {

    private LinearLayout parentLinearLayout;

    private int numtest = 0;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        parentLinearLayout = (LinearLayout) findViewById(R.id.parent_linear_layout);
    }
    public void onAddField(View v) {
        LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        final View rowView = inflater.inflate(R.layout.field, null);
        // Add the new row before the add field button.
        parentLinearLayout.addView(rowView, parentLinearLayout.getChildCount() - 1);
    }

    public void addone(View v){
        numtest+=1;
        TextView t = (TextView) findViewById(R.id.counter);
        t.setText(numtest+"");
    }

    public void subtractone(View v){
        numtest-=1;
        TextView t = (TextView) findViewById(R.id.counter);
        t.setText(numtest+"");
    }

}
field.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="50dp"
    android:orientation="horizontal" >

    <EditText
        android:id="@+id/edit_text"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="3"
        android:inputType="textWebEditText"/>
    <Spinner
        android:id="@+id/type_spinner"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="3"
        android:entries="@array/types"
        android:gravity="right" />
    <Button
        android:id="@+id/add_button"
        android:layout_width="0dp"
        android:layout_height="40dp"
        android:layout_weight="1"
        android:background="@android:drawable/ic_delete"
        android:onClick="addone"/>
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:layout_gravity="center_vertical"
        android:text="0"
        android:id="@+id/counter"
        android:textSize="30dp"
        android:layout_centerHorizontal="true"/>
    <Button
        android:id="@+id/subtract_button"
        android:layout_width="0dp"
        android:layout_height="40dp"
        android:layout_weight="1"
        android:background="@android:drawable/ic_delete"
        android:onClick="subtractone"/>

</LinearLayout>

activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/parent_linear_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_margin="5dp"
    android:orientation="vertical" >
    <Button
        android:id="@+id/add_field_button"
        android:layout_width="100dp"
        android:layout_height="wrap_content"
        android:layout_marginBottom="5dp"
        android:layout_marginLeft="5dp"
        android:layout_marginRight="5dp"
        android:background="#555"
        android:layout_gravity="center"
        android:onClick="onAddField"
        android:textColor="#FFF"
        android:text="Add Field"
        android:paddingLeft="5dp"/>
</LinearLayout>


提前感谢

我认为您应该跟踪在父布局中单击按钮的索引。一个简单的方法是查看标记

public void onAddField(View v) {
LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
final View rowView = inflater.inflate(R.layout.field, null);
 // Add the new row before the add field button.
 //put index tag on your view
rowView.findViewById(R.id.add_button).setTag(parentLinearLayout.getChildCount() - 1)
rowView.findViewById(R.id.substract_button).setTag(parentLinearLayout.getChildCount() - 1)   
    parentLinearLayout.addView(rowView, parentLinearLayout.getChildCount() - 1);
    }
现在你有了要跟踪的索引,你就可以得到要更新的视图了

public void addone(View v){
        numtest+=1;
        View parent = parentLinearLayout.getChildAt(v.getTag());  
        TextView t = (TextView) parent.findViewById(R.id.counter);
        t.setText(numtest+"");
    } /// similarly for other method substract

希望这对您有用

您可以声明一个计数器变量并用零初始化它,每次用户单击“添加”按钮时增加一个计数器变量,然后通过
rowView.setId(计数器)将其值设置为新创建的rowView的id
然后您可以通过其id唯一地标识每一行,因此您可以控制应该增加/减少的计数器。

从何处调用
addone()
。?不要在方法中初始化文本视图。在onCreate中完成。谢谢,它成功了。但是,我现在有一个问题,第二行的数字是从前一行的数字加上的,而不是从0开始。你是说numtest变量?是的numtest变量。我想问的是,有没有一种方法可以为每个动态添加的新行创建一个单独的numtest变量。因为所有行的numtest值都相同,所以出现问题。