如何在屏幕大小更改时动态管理TextView的位置

时间:2017-11-25 07:22:40

标签: java android xml textview android-linearlayout

我在一个水平布局中有两个文本视图,第一个是普通文本,第二个是可以用不同颜色点击。

XML

   <!--inside rootlayout..-->

<LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:layout_margin="10dp"
        android:orientation="horizontal">

        <TextView
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:layout_gravity="center_horizontal"
          android:gravity="center_horizontal"
          android:maxLines="2"
          android:text="By clicking sign up, you agree to our "
          android:textColor="@color/black"
          android:textSize="12sp"/>

        <TextView
          android:textStyle="bold"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:gravity="center_horizontal"
          android:text="terms and conditions"
          android:textColor="@color/colorPrimary"
          android:textSize="12sp"
          android:clickable="true"/>

      </LinearLayout>

它让我在大屏幕(4.7英寸及以上)上看起来很棒,  但是当屏幕尺寸较小时,第二个文本视图会变得很奇怪。我希望它自动将自己定位在第一个textview下方或使其父布局方向垂直。!!

这是它的外观。!

enter image description here

更新#1

为什么ForegroundColorSpan不会改变!?无论我设置什么颜色资源,它总是显示蓝色或黑色。!??

private void handleTermsConditions() { 
    SpannableStringBuilder stringBuilder = new SpannableStringBuilder(termsTxt.getText());
    stringBuilder.setSpan(new StyleSpan(Typeface.BOLD), 38, 58, 0);
    int color = ContextCompat.getColor(RegistrationActivity.this, R.color.colorPrimary);
    ForegroundColorSpan fcs = new ForegroundColorSpan(color);
    stringBuilder.setSpan(fcs, termsTxt.getText().length() - 20, termsTxt.getText().length(),
        Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
    ClickableSpan clickableSpan = new ClickableSpan() {

      @Override
      public void onClick(View widget) {
        Toast.makeText(RegistrationActivity.this, "Click", Toast.LENGTH_SHORT)
            .show();
      }
    };

    stringBuilder.setSpan(clickableSpan, 38, 58, Spanned.SPAN_POINT_MARK); 
    termsTxt.setMovementMethod(LinkMovementMethod.getInstance());
    termsTxt.setText(stringBuilder);
  }

6 个答案:

答案 0 :(得分:2)

同一问题here或来自the original document

答案 1 :(得分:2)

DisplayMetrics displayMetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
int height = displayMetrics.heightPixels;
int width = displayMetrics.widthPixels;

getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);

获取设备的高度和宽度,并使用这些值来决定是否将屏幕设置为纵向:

if ((height == <value>) && (width == <value>)) {
setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}

*您可以根据活动的需要随意修改

答案 2 :(得分:1)

根据您的要求,您不必为此使用2个文本视图,只需在1个文本上放置 spannable 字符串构建器,并将可点击和颜色属性设置为已完成

<强>代码:

 TextView textView = findViewById(R.id.tvSample);
    SpannableStringBuilder stringBuilder  =new SpannableStringBuilder(textView.getText());
    stringBuilder.setSpan(new ForegroundColorSpan(Color.BLUE),textView.getText().length()-20,textView.getText().length(),Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
    stringBuilder.setSpan(new ClickableSpan() {
        @Override
        public void onClick(final View view) {
            Toast.makeText(MainActivity.this,"Click",Toast.LENGTH_LONG).show();
        }
    },textView.getText().length()-20,textView.getText().length(),Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
  textView.setText(stringBuilder);

以下是example在文本视图中放置不同的范围

This是如何在单个文本视图上设置两个范围

答案 3 :(得分:1)

您可以使用值文件夹根据屏幕大小设置TextView字体大小或宽度。 Try like this

答案 4 :(得分:1)

您可以使用最简单的方式 Android Spannable属性来执行此操作。通过这种方式,您可以通过单个textview完成这项工作,并可以管理您的点击事件。

这是执行此操作的代码。

public void setHighLightedText(TextView textView, String textToHighlight) {
    String tvt = textView.getText().toString();
    int ofe = tvt.indexOf(textToHighlight, 0);

    ClickableSpan clickableSpan = new ClickableSpan() {
        @Override
        public void onClick(View textView) {
 //            here you do all stuff
        }

        @Override
        public void updateDrawState(TextPaint ds) {
            super.updateDrawState(ds);
            ds.setColor(0xff0000ff);
            ds.setUnderlineText(true);
 // Here you can put your style on textview.
        }
    };

    SpannableString wordtoSpan = new SpannableString(textView.getText());

    for (int ofs = 0; ofs < tvt.length() && ofe != -1; ofs = ofe + 1) {
        ofe = tvt.indexOf(textToHighlight, ofs);
        if (ofe == -1)
            break;
        else {
            wordtoSpan.setSpan(clickableSpan, ofe, ofe + textToHighlight.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
            textView.setText(wordtoSpan, TextView.BufferType.SPANNABLE);
            textView.setMovementMethod(LinkMovementMethod.getInstance());
        }
    }
}

您可以在其中看到onClick方法。如果将此代码放在Utility类中,则可以设置单击或使用回调。

加成

这也是正确的方法。

答案 5 :(得分:0)

使用Fragments

尝试使用autoSizeText

<TextView
.......
android:autoSizeTextType="uniform"
................................../>

Android开发人员site

上有关于它的内容