如何在不替换旧文本的情况下向 TextView 添加文本?

How to add text to TextView without replacing the old text?

正如我在标题中提到的,我想向 Textview 添加文本而不替换之前的文本。

在我的应用程序中,我有一个 TextView 和 7 个按钮。在每次单击按钮时,我将按钮的文本设置为 TextView。

如果第一次单击按钮,将文本设置为 TextView,如果第二次单击同一个按钮,我将从 TextView 中删除该按钮的文本。

这里我想做的是在 TextView 中设置 7 个按钮的位置(太阳坐下的唯一性),当单击相应按钮时,文本设置为 TextView,如果第二次单击按钮文本的特定位置应该删除的时间。

此处的文本不应替换之前的重要文本,如果选择了某些按钮并再次取消选择意味着 TextView 应将默认文本显示为 "Never"

我试图从 SO 获取源代码,但找不到明确的解决方案。

如果有人能帮助我走出困境,那对我很有帮助。

编码

public class CreateAlarm extends Activity implements View.OnClickListener {

    private Button mbtn_Sun, mbtn_Mon, mbtn_Tue, mbtn_Wed, mbtn_Thu, mbtn_Fri, mbtn_Sat;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_create_alarm);

        mRepeat = (TextView) findViewById(R.id.mRepeat);

        mbtn_Sun = (Button) findViewById(R.id.mbtn_Sun);
        mbtn_Mon = (Button) findViewById(R.id.mbtn_Mon);
        mbtn_Tue = (Button) findViewById(R.id.mbtn_Tue);
        mbtn_Wed = (Button) findViewById(R.id.mbtn_Wed);
        mbtn_Thu = (Button) findViewById(R.id.mbtn_Thu);
        mbtn_Fri = (Button) findViewById(R.id.mbtn_Fri);
        mbtn_Sat = (Button) findViewById(R.id.mbtn_Sat);

        mbtn_Sun.setOnClickListener((View.OnClickListener) this);
        mbtn_Mon.setOnClickListener((View.OnClickListener) this);
        mbtn_Tue.setOnClickListener((View.OnClickListener) this);
        mbtn_Wed.setOnClickListener((View.OnClickListener) this);
        mbtn_Thu.setOnClickListener((View.OnClickListener) this);
        mbtn_Fri.setOnClickListener((View.OnClickListener) this);
        mbtn_Sat.setOnClickListener((View.OnClickListener) this);

        int hours = mTimePicker.getCurrentHour();
        mCancel.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                finish();
            }
        });

    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.mbtn_Sun:
                if (mRepeat.getText().toString().contains("Sun")) {
                    mRepeat.setText("");
                } else
                    mRepeat.setText("Sun");
                break;
            case R.id.mbtn_Mon:
                if (mRepeat.getText().toString().contains("Mon")) {
                    mRepeat.setText("");
                } else
                    mRepeat.setText("Mon");
                break;
            case R.id.mbtn_Tue:
                if (mRepeat.getText().toString().contains("Tue")) {
                    mRepeat.setText("");
                } else
                    mRepeat.setText("Tue");
                break;
            case R.id.mbtn_Wed:
                if (mRepeat.getText().toString().contains("Wed")) {
                    mRepeat.setText("");
                } else
                    mRepeat.setText("Wed");
                break;
            case R.id.mbtn_Thu:
                if (mRepeat.getText().toString().contains("Thu")) {
                    mRepeat.setText("");
                } else
                    mRepeat.setText("Thu");
                break;
            case R.id.mbtn_Fri:
                if (mRepeat.getText().toString().contains("Fri")) {
                    mRepeat.setText("");
                } else
                    mRepeat.setText("Fri");
                break;
            case R.id.mbtn_Sat:
                if (mRepeat.getText().toString().contains("Sat")) {
                    mRepeat.setText("");
                } else
                    mRepeat.setText("Sat");
                break;
            default:
                    mRepeat.setText("Never");
        }
    }
}

图片:

默认情况下,TextView 文本为 "Never"。

您应该首先设置每个按钮 ID,将其添加到每个特定按钮的 xml 中:android:id="sun" 和 ...

我的建议是:使用单个 TextView 会使您的逻辑变得相当复杂

改为使用水平 LinearLayout,您将在内部有 7 个 TextView,并带有预定义的文本和位置。只需简单地 show/hide 根据单击哪个按钮来确定它们,您不必处理任何复杂的字符串分析。

您可以将 TreeMap 定义为:

private TreeMap<Integer, String> mAlarmDays = new TreeMap<>();

作为 class 和 add/remove 天的字段 to/from TreeMap 单击相应按钮时。所以 onClick 方法的实现将是:

@Override
public void onClick(View v) {
    switch (v.getId()) {
        case R.id.mbtn_Sun:
            if (mRepeat.getText().toString().contains("Sun")) {
                mAlarmDays.remove(0);
            } else
                mAlarmDays.put(0, "Sun");
            break;
        case R.id.mbtn_Mon:
            if (mRepeat.getText().toString().contains("Mon")) {
                mAlarmDays.remove(1);
            } else
                mAlarmDays.put(1, "Mon");
            break;
        case R.id.mbtn_Tue:
            if (mRepeat.getText().toString().contains("Tue")) {
                mAlarmDays.remove(2);
            } else
                mAlarmDays.put(2, "Tue");
            break;
        case R.id.mbtn_Wed:
            if (mRepeat.getText().toString().contains("Wed")) {
                mAlarmDays.remove(3);
            } else
                mAlarmDays.put(3, "Wed");
            break;
        case R.id.mbtn_Thu:
            if (mRepeat.getText().toString().contains("Thu")) {
                mAlarmDays.remove(4);
            } else
                mAlarmDays.put(4, "Thu");
            break;
        case R.id.mbtn_Fri:
            if (mRepeat.getText().toString().contains("Fri")) {
                mAlarmDays.remove(5);
            } else
                mAlarmDays.put(5, "Fri");
            break;
        case R.id.mbtn_Sat:
            if (mRepeat.getText().toString().contains("Sat")) {
                mAlarmDays.remove(6);
            } else
                mAlarmDays.put(6, "Sat");
            break;
    }
    StringBuilder repeatDays = new StringBuilder();
    if (mAlarmDays.size() == 0) {
        repeatDays = new StringBuilder("Never");
    } else {
        for (String day:mAlarmDays.values()) {
            repeatDays.append(day).append(" ");
        }
    }
    mRepeat.setText(repeatDays.toString());
}