【问题标题】:How to edit a TextView which has been dynamically added?如何编辑已动态添加的 TextView?
【发布时间】:2018-04-02 18:03:42
【问题描述】:

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

主活动:

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>

提前致谢

【问题讨论】:

  • 你从哪里打电话给addone()..?
  • 不要在方法中初始化文本视图。在 onCreate 中执行。

标签: android android-linearlayout


【解决方案1】:

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

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

希望这对你有用

【讨论】:

  • 谢谢它的工作。但是,我现在遇到了这个问题,第二行的数字是从前一行的数字加上而不是从 0 开始的。
  • 你的意思是 numtest 变量?
  • 是的 numtest 变量。我要问的是有没有办法为每个新的动态添加的行创建一个单独的 numtest 变量。因为出现问题是因为所有行的 numtest 值都相同。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-13
    • 2019-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多