TextView - 将视图移动到结尾

时间:2016-05-26 22:48:04

标签: java android textview

我有一个 Aws.config( #:access_key_id => ENV['AWS_ACCESS_KEY_ID'], :access_key_id => 'XXXXXXXXX', #:secret_access_key => ENV['AWS_SECRET_ACCESS_KEY'] :secret_access_key => 'XXXXXXX' ) #S3_BUCKET = AWS::S3.new.buckets[ENV['S3_BUCKET']] S3_BUCKET = Aws::S3.new.buckets['ringlecourse'] 多行。如何确定视图是否适合那里的空间?

示例:

TextView

所以我希望我的视图位于右下角,它不应该叠加文本,但如果有足够的空间则右侧

2 个答案:

答案 0 :(得分:1)

基本上,您需要查看最后一行的右侧(y坐标)到达的位置,然后计算另一个视图是否适合剩余的空间。

我在这里做了2个文本视图的示例,但它可以应用于您希望的任何视图。 xml非常直接,没什么特别的。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/text1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="kasjdf as df asd  aasdfasdff as dfa sd  sdf as df asd fa sd fa sdf as dfanas,df askdjfasjdf lkajsldkf jlaksjdfajsdkfj alskdj fklasjdflkasjdlkfdflk ajskldf" />

    <TextView
        android:id="@+id/text2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:text="attached text"
        android:textColor="@android:color/holo_blue_dark" />

</RelativeLayout>

这里有一个问题,在text1和text2被绘制到布局之后,我正在计算text1的最后一行到达的位置,以及text2的宽度 - 看它是否适合屏幕的宽度。

  • 只有在绘制了text1和text2之后,我才能检查宽度和右边位置,所以我在setText2Position中等待它们。
  • 此处的问题 - 根据上述计算向text2添加规则。
  • 如果您的观点有边距和填充,则需要计算 fe,如果text2有填充,则检查应为:

lastLineRight + text2.getWidth()+ text2.getPaddingRight()+ text2.getPaddingLeft()&gt;屏幕宽度

public class MainActivity extends AppCompatActivity {

    private boolean[] areBothViewsDrawn = {false, false};

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

        final TextView text1 = (TextView) findViewById(R.id.text1);
        final TextView text2 = (TextView) findViewById(R.id.text2);

        text1.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                text1.getViewTreeObserver().removeGlobalOnLayoutListener(this);
                areBothViewsDrawn[0] = true;
                setText2Position(text1, text2);
            }
        });

        text2.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                text2.getViewTreeObserver().removeGlobalOnLayoutListener(this);
                areBothViewsDrawn[1] = true;
                setText2Position(text1, text2);
            }
        });

    }

    private void setText2Position(TextView text1, TextView text2) {
        if (!areBothViewsDrawn[0] || !areBothViewsDrawn[1])
            return;

        int lineCount = text1.getLayout().getLineCount();
        float lastLineRight = text1.getLayout().getLineRight(lineCount - 1);

        Display display = getWindowManager().getDefaultDisplay();
        Point size = new Point();
        display.getSize(size);
        int screenWidth = size.x;

        RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) text2.getLayoutParams();
        if (lastLineRight + text2.getWidth() > screenWidth) {
            //The width of the last line of text1 is too long for the text2 to fit, so text2 must be in another line
            params.addRule(RelativeLayout.BELOW, text1.getId());
        } else {
            //The width of the last line of text1 and text2 smaller then the application's width, so text2 can be in the same line as text1
            params.addRule(RelativeLayout.ALIGN_BOTTOM, text1.getId());
        }
    }
}

以下是我的代码的一些内容:

bottom

right

答案 1 :(得分:0)

我认为这个问题需要更多背景。 (只是好奇你为什么要这样做)

这样的事情是可能的,如果TextView在XML中定义了设置的宽度/高度,那么会更容易。如果您只是动态获取信息,那么可以使用steps you'd have to take来确保您获得正确的测量结果。

我想的一种方法是获取整个TextView的宽度,并获得它与实际文本宽度之间的差异(可能是getLineCount()/getLineBounds(int, Rect?)getTextScaleX()的组合?)。然后是convert it to dp