如何在一行中查看两个不同的textview,但在用户看来是一个textview?

时间:2017-09-07 11:58:40

标签: android textview android-xml


我有两个不同的字体和样式,我需要将它们放在一行中,但用户似乎只有一个
更多细节,如果屏幕上的第二个文字很大,我需要在第一个文本下的第二行完成 ex-1: text1 text2
ex-2: teeeeeext1 teeeeee
    eeeext2
我不知道是否可以这样做,所以我请求帮助 的 [编辑]
将它们放在两个中是很重要的,因为我会为它们设置两个不同的点击监听器 感谢。

4 个答案:

答案 0 :(得分:1)

如果你想要你可以使用fromHtml标签,以便只在一个文本视图中使用字体和样式..这也将满足下一行中文本的需要

答案 1 :(得分:1)

您可以使用我在this和android的StyleSpan类的帮助下编写的自定义span类。

import android.graphics.Paint;
import android.graphics.Typeface;
import android.support.annotation.Nullable;
import android.text.TextPaint;
import android.text.style.ClickableSpan;
import android.view.View;

/**
 * Created by aminmsvi on 9/7/2017
 */
public class CustomClickableSpan extends ClickableSpan {

    private final int mStyle;
    private final ClickableSpanListener mListener;

    /**
     * @param style An integer constant describing the style for this span. Examples
     *              include bold, italic, and normal. Values are constants defined
     *              in {@link android.graphics.Typeface}.
     */
    public CustomClickableSpan(@Nullable ClickableSpanListener listener, int style) {
        mStyle = style;
        mListener = listener;
    }

    /**
     * Copied this method from {@link android.text.style.StyleSpan} source code
     */
    private static void apply(Paint paint, int style) {
        int oldStyle;

        Typeface old = paint.getTypeface();
        if (old == null) {
            oldStyle = 0;
        } else {
            oldStyle = old.getStyle();
        }

        int want = oldStyle | style;

        Typeface tf;
        if (old == null) {
            tf = Typeface.defaultFromStyle(want);
        } else {
            tf = Typeface.create(old, want);
        }

        int fake = want & ~tf.getStyle();

        if ((fake & Typeface.BOLD) != 0) {
            paint.setFakeBoldText(true);
        }

        if ((fake & Typeface.ITALIC) != 0) {
            paint.setTextSkewX(-0.25f);
        }

        paint.setTypeface(tf);
    }

    @Override
    public void onClick(View widget) {
        if (mListener != null) {
            mListener.onClick();
        }
    }

    @Override
    public void updateDrawState(TextPaint ds) {
         apply(ds, mStyle);
    }

    public interface ClickableSpanListener {

        void onClick();
    }
}

你可以像这样使用它:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        ...
        TextView textView = findViewById(R.id.text);
        SpannableString spannableString = new SpannableString("This is a text");
        spannableString.setSpan(new CustomClickableSpan(() -> Toast.makeText(this, "This is a text".substring(0, 4), Toast.LENGTH_SHORT).show(), Typeface.BOLD), 0, 4, 0);
        spannableString.setSpan(new CustomClickableSpan(() -> Toast.makeText(this, "This is a text".substring(5, 10), Toast.LENGTH_SHORT).show(), Typeface.ITALIC), 5, 10, 0);
        textView.setText(spannableString);
        textView.setMovementMethod(LinkMovementMethod.getInstance());
        // if you want to remove highlight color, uncomment this line
        // textView.setHighlightColor(Color.TRANSPARENT);
        ...
    }
}

希望这有帮助。

答案 2 :(得分:0)

您可以使用SpannableStringBuilder类来实现,我想这是您要搜索的答案SpannableStringBuilder

答案 3 :(得分:0)

如果您希望在不向用户提供单一内容的情况下显示两个textview的一面,请尝试以下操作:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horzontal" >


<TextView
    android:id="@+id/textView3"
    android:layout_width="0dp"
    android:padding="5dp"
    android:gravity="center|start"
    android:layout_height="match_parent"
    android:layout_weight="1"
    android:text="TextView" />

<TextView
    android:id="@+id/textView2"
    android:layout_width="0dp"
    android:layout_height="match_parent"
    android:layout_weight="1"
    android:padding="5dp"
    android:text="TextView asdasdasd as das dasdasdas adasd asdas d" />

希望它有所帮助。