gpt4 book ai didi

安卓布局 : Wrap two textview

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:45:00 26 4
gpt4 key购买 nike

我想实现如下布局

AAAAAAAAAAAAAAAAAA
AAAAA... BBBBBBBBB

其中 AAAA 是一个 TextView (ellipsize = "end") 而 BBB 也是一个 TextView 。它永远不会超过两行。我只需要第一个 textview 包裹在第二个。

我应该怎么做?

Idea in screenshot

最佳答案

最终结果

enter image description here

解释

绝不是完美的,可能需要进行一些调整才能满足您的需求。我省略了 ellipsize 部分以使其更通用,但很容易为此修改代码。这个想法很简单,但我花了几个小时(只是因为是星期天)才让它发挥作用。我们计算第二个 TextView 中还有多少字符适合第一个的最后一行。然后用那个数字,我们将最后一行添加到第二个 TextView 中,颜色与容器的背景相匹配,这是一个可能以某种方式解决的限制,但我似乎无法找到它。

这样,我们就可以让两个 View 的文本对齐,但它们仍然不会相互重叠以产生环绕效果。所以我们获取文本的高度并为第二个添加负边距以便它们重叠,以确保第一个 TextView 位于第二个之上我们需要调用 bringToFront () 以避免在第一行的最后一行上使用与背景颜色相同的文本(哇,这让人感到困惑)。对于不同的字体和粗细(例如粗体),它可能不工作,因为字符可能会占用更多空间。

我没有把它变成一个方法,但它很容易变得通用和可重用,只是想证明我是否能做到。这是任何人和每个人都可以享受和改进的代码。布局只是一个容器(例如 RelativeLayout)和两个 id 为 firstsecond 的 TextView ,我将文本颜色设置为在第二个上涂上红色以使其更清晰,但这不是必需的。

代码

    final TextView first = (TextView) findViewById(R.id.textView);
final TextView second = (TextView) findViewById(R.id.textView2);
final ViewGroup container = (ViewGroup)findViewById(R.id.container);
final ViewTreeObserver obs = findViewById(R.id.container).getViewTreeObserver();

obs.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
//Get characters from the first TextView's last line
String lastLine = first.getText().toString().substring(first.getLayout().getLineStart(first.getLineCount() - 1));

//Calculate the number of extra characters that will fit in the first one
int e = 0; //Extra characters
int lineCount = first.getLineCount();
while (lineCount == first.getLineCount() && e < second.getText().toString().length() - 1) {
first.append(second.getText().toString().substring(e, e + 1));
e++;
}

//Remove those characters again to leave the first TextView as it was
String firstString = first.getText().toString();
first.setText(firstString.substring(0, firstString.length() - e));

//Add the last line of the first textview to the second textview
second.setText(Html.fromHtml("<font color='#F2F2F2'>"+lastLine+"</font>"+second.getText()));

//add a negative margin to the second textview equal to a line's height
ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) second.getLayoutParams();
params.topMargin = -(int)(first.getLineHeight()+10);
second.setLayoutParams(params);

//Make sure first is on top
first.bringToFront();

//Remove the listener
if (Build.VERSION.SDK_INT < 16) {
container.getViewTreeObserver().removeGlobalOnLayoutListener(this);
} else {
container.getViewTreeObserver().removeOnGlobalLayoutListener(this);
}
}
});

关于安卓布局 : Wrap two textview,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26050280/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com