Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何在不替换旧文本的情况下向TextView添加文本?_Android_Textview - Fatal编程技术网

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

Android 如何在不替换旧文本的情况下向TextView添加文本?,android,textview,Android,Textview,正如我在标题中提到的,我想在不替换前一个文本的情况下向Textview添加文本 在我的应用程序中,我有一个文本视图和7个按钮。在每个按钮上单击,我将按钮的文本设置为文本视图 如果第一次单击按钮,则将文本设置为TextView,如果第二次单击相同的按钮,则我将从TextView中删除该按钮的文本 这里我要做的是为7个按钮设置位置(太阳到卫星的唯一性),当单击相应的按钮时,文本设置为文本视图,如果第二次单击按钮,则文本的特定位置应删除 此处的文本不应取代之前的重要文本,如果选择了某些按钮,并且再次取

正如我在标题中提到的,我想在不替换前一个文本的情况下向Textview添加文本

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

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

这里我要做的是为7个按钮设置位置(太阳到卫星的唯一性),当单击相应的按钮时,文本设置为文本视图,如果第二次单击按钮,则文本的特定位置应删除

此处的文本不应取代之前的重要文本,如果选择了某些按钮,并且再次取消选择,则表示TextView应将默认文本显示为“从不”

我试着从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文本为“从不”。

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

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


使用水平
LinearLayout
,您将有7个
TextView
内部,其中包含预定义的文本和位置。只需根据单击的按钮显示/隐藏它们,您无需处理任何复杂的字符串分析。

您可以将树映射定义为:

private TreeMap mAlarmDays=new 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());
}

您不认为这会导致需要维护更多的代码吗?另外,更多的视图将消耗更多的内存。
需要维护更多的代码
:我的直觉是否定的,您的解决方案目前只将所有逻辑保留在一个字符串中,因此它必须非常复杂,否则代码:查找、替换、将字符串插入字符串有点痛苦<代码>更多的视图消耗更多的内存
:我的经验告诉我,没关系。这是一种折衷的情况,性能与内存是折衷的,反之亦然。此外,我还必须处理一个非常大的活动,有近百个视图加上片段,它们仍然处于良好状态。在您的情况下,我假设这是一个设置活动,因此它';it’这不是一个主要问题,当用easy logic完成7个视图时,一切都会被清除。用1-view-with-Pre痛-logic进行交易对我来说是值得的。当然,如果你喜欢的话,你可以用它。我们开发人员有时有不同的偏好。:)@Nikson Welcome虽然这个解决方案在某些方面比我的好,但我只想让它成为最好的<在Android中应该避免使用code>Map,
SparseArray
是一种替代品,因为只有当您使用
int
作为键时,内存分配才会更好。这里提到了优点和缺点。Android还建议使用这种方法,如果可以的话,请考虑使用<代码> SpasRays。@ TamHuynh,我们需要按键排序。是的,我理解,它可以通过for循环通过索引0到6,并获得值。再次权衡这个案子。但好吧,这取决于每个案例和开发人员的风格,我只是想得太多了