【问题标题】:What is the best way to put an edit text in the middle of a text string?将编辑文本放在文本字符串中间的最佳方法是什么?
【发布时间】:2014-03-04 13:24:21
【问题描述】:

我想创建一个填空活动。
例子: “昨天的天气是(在此处编辑文本)。”
“男孩们在课间玩耍(在此处编辑文本)。” “Lucy 昨天午餐时喝了酒(在此处编辑文本)。”

按照我现在的设置方式,我在编辑文本之前和之后都有一个文本视图。问题是文本视图的文本是由从意图发送的 putStringExtra 方法设置的。我永远不知道这两种观点的文字会持续多久。如果文本太长,那么第二个视图的文本最后会被挤成一团。也就是说,文本在第二个文本视图上换行。我想要实现的是环绕整个屏幕的文本。目前,我正在检查第二个文本视图的行数。如果有多个,那么我将该文本放在第一个布局下方的布局中的 textview 中。似乎有一种更简单的方法可以做到这一点。这是我的代码,感谢您的帮助:

 public void setText(double w, double t) {
    final double HalfScreenWidth = w;
    final double totalScreenWidth = t;
    TextView1.setText(getIntent().getExtras().getString("SentPart1"));
    TextView2.setText(getIntent().getExtras().getString("SentPart2"));
    TextView3.setText("");


    TextView1.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED);
    tVWidth = TextView1.getMeasuredWidth();

    if (totalScreenWidth > 1100) {
        linLay1.removeAllViews();
        linLay2.removeAllViews();

        linLay1.addView(TextView1);
        linLay1.addView(EditText);
        linLay1.addView(TextView2);
        linLay1.addView(TextView3);
    } else if (tVWidth > HalfscreenWidth && totalScreenWidth < 1100) {
        linLay1.removeAllViews();
        linLay2.removeAllViews();

        linLay1.addView(TextView1);
        linLay1.addView(EditText);
        linLay2.addView(TextView2);
    } else if (tVWidth < HalfScreenWidth && totalScreenWidth < 1100) {
        linLay1.removeAllViews();
        linLay2.removeAllViews();
        linLay1.setVisibility(View.INVISIBLE);
        linLay2.setVisibility(View.INVISIBLE);
        linLay1.addView(TextView1);
        linLay1.addView(EditText);
        linLay1.addView(TextView2);
        linLay2.addView(TextView3);
        h.postDelayed(r, 100);

    }

}

final Runnable r = new Runnable() {
    public void run() {

        int lineCount = TextView2.getLineCount();
        if (lineCount == 1) {
            linLay2.removeView(TextView3);
            linLay1.addView(TextView3);
        } else if (lineCount == 2) {
            int lineStart0 = TextView2.getLayout().getLineStart(0);
            int lineEnd0 = TextView2.getLayout().getLineEnd(0);
            int lineStart = TextView2.getLayout().getLineStart(1);
            int lineEnd = TextView2.getLayout().getLineEnd(1);

            CharSequence extraText0 = TextView2.getText().subSequence(
                    lineStart0, lineEnd0);
            CharSequence extraText =  TextView2.getText().subSequence(lineStart,
                    lineEnd);
            TextView2.setText(extraText0);
            TextView3.setText(extraText);

        } else if (lineCount == 3) {
            int lineStart0 = TextView2.getLayout().getLineStart(0);
            int lineEnd0 = TextView2.getLayout().getLineEnd(0);
            int lineStart1 = TextView2.getLayout().getLineStart(1);
            int lineEnd1 = TextView2.getLayout().getLineEnd(1);
            int lineStart2 = TextView2.getLayout().getLineStart(2);
            int lineEnd2 = TextView2.getLayout().getLineEnd(2);

            CharSequence extraText0 = TextView2.getText().subSequence(
                    lineStart0, lineEnd0);
            CharSequence extraText1 = TextView2.getText().subSequence(
                    lineStart1, lineEnd1);
            CharSequence extraText2 = TextView2.getText().subSequence(
                    lineStart2, lineEnd2);

            CharSequence oneTwo = TextUtils.concat(extraText1, extraText2);
            TextView2.setText(extraText0);
            TextView3.setText(oneTwo);

        } else if (lineCount == 4) {
            int lineStart0 = TextView2.getLayout().getLineStart(0);
            int lineEnd0 = TextView2.getLayout().getLineEnd(0);
            int lineStart1 = TextView2.getLayout().getLineStart(1);
            int lineEnd1 = TextView2.getLayout().getLineEnd(1);
            int lineStart2 = TextView2.getLayout().getLineStart(2);
            int lineEnd2 = TextView2.getLayout().getLineEnd(2);
            int lineStart3 = TextView2.getLayout().getLineStart(3);
            int lineEnd3 = TextView2.getLayout().getLineEnd(3);

            CharSequence extraText0 = TextView2.getText().subSequence(
                    lineStart0, lineEnd0);
            CharSequence extraText1 = TextView2.getText().subSequence(
                    lineStart1, lineEnd1);
            CharSequence extraText2 = TextView2.getText().subSequence(
                    lineStart2, lineEnd2);
            CharSequence extraText3 = TextView2.getText().subSequence(
                    lineStart3, lineEnd3);

            CharSequence oneTwo = TextUtils.concat(extraText1, extraText2,
                    extraText3);
            TextView2.setText(extraText0);
            TextView3.setText(oneTwo);
 }
linLay1.setVisibility(View.VISIBLE);
        linLay2.setVisibility(View.VISIBLE);
}

我添加了一个可运行文件,因为 Android 似乎需要稍作停顿才能在屏幕上绘制文本。

【问题讨论】:

    标签: android android-edittext word-wrap


    【解决方案1】:

    您可以在水平方向使用LinearLayout,并将TextView 放在EditText 的两侧。像这样:

    <LinearLayout 
        android:orientation="horizontal" >
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="The weather was " /> <!-- Just for short answer, should be put elsewhere -->
        <EditText
            android:id="@+id/myEditText"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text=" yesterday." /> <!-- Just for short answer, should be put elsewhere -->
    </LinearLayout>
    

    在您的代码中,您可以像这样设置文本:

    // Written here as if it where put in and Activity
    public void setYesterdayWeather(final String text) {
        runOnUiThread(new Runnable() {
    
            @Override
            public void run() {
                TextView v = (TextView) findViewById(R.id.myEditText);
                v.setText(text);
            }
        });
    }
    

    之后,您可以使用 TextWatcher 监听更改并调整 EditText 的大小,使其始终像这样包裹其文本:

    // On inflation, likely in Activity.onCreate()
    final TextView v = (TextView) findViewById(R.id.myEditText);
    v.addTextChangedListener(new TextWatcher() {
    
        [...]
    
        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            float textSize = v.getPaint().measureText(s, start, start + count);
            // onTextChanged may run on Ui Thread, but if it's not the case, the following statement must be called inside a Runnable posted to the main Looper.
            v.setWidth(textSize); // Eventually, take some extra space for padding ?
        }
    });
    

    【讨论】:

    • 谢谢,但第二个文本视图会自动环绕...它在编辑文本之后会聚在一起。我希望文本环绕整个屏幕。
    • 您需要在每次更改 EditText 的文本时调整其大小。使用TextWatcher 注册。然后,您可以使用TextView.getPaint().measureText 获取文本的新大小。
    • 谢谢,但是 TextViews 的大小正在改变。此外,在您的 javascript 中,您将编辑文本转换为 textview 然后设置文本?我希望用户在文本视图中输入文本。但我喜欢文本观察者的想法。我会调查的。谢谢。
    • 当然,如果EditText 变得太大,整个文本(即“昨天天气是”)将无法容纳在一行中,但这是另一个问题。也许有些误解,但我的代码是常规的 java,而不是 javascript。我将编辑我的答案。
    • edittext.append() 怎么样?或者可能是这个答案:
    【解决方案2】:

    您可以在活动中设置它:

    String chaine ="The weather was"+getIntent().getExtras().getString("your String name")+"yesterday." ;
            TextView text = (TextView) findViewById(R.id.text);
    text.setText(chaine);
    

    在 XML 中:

    【讨论】:

    • 如果你想使用 EditText 改变 textView 和 EditText
    猜你喜欢
    • 1970-01-01
    • 2010-09-09
    • 1970-01-01
    • 2011-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-20
    相关资源
    最近更新 更多