【问题标题】:How to manage the position of TextViews dynamically when screen size changes屏幕尺寸变化时如何动态管理TextViews的位置
【发布时间】:2018-05-09 01:50:30
【问题描述】:

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

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 下方或使其父布局方向垂直..!!

这是它的外观。!


更新 #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);
  }

【问题讨论】:

  • 我认为它是自动发生的......这取决于空间,如果它有足够的空间,那么它就像在第一个屏幕中一样

标签: java android xml textview android-linearlayout


【解决方案1】:

同样的问题here 或来自the original document

【讨论】:

    【解决方案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);
    }
    

    *根据您的活动要求随意修改

    【讨论】:

      【解决方案3】:

      根据您的要求,您不必为此使用 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 是如何在单个文本视图上设置两个跨度

      【讨论】:

      • 为什么ForegroundColorSpan 不会改变?我使用了我的 res 文件中的一种颜色,但它总是显示为蓝色?这是代码int color = getResources().getColor(R.color.colorPrimary);ForegroundColorSpan fcs =new ForegroundColorSpan(color);stringBuilder.setSpan(fcs,termsTxt.getText().length()-20,termsTxt.getText().length(),Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
      • int color = ContextCompat.getColor(context, R.color.your_color);
      • 还是一样..!我在更新 #1 中发布了完整的代码。请看一看。
      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

        这是执行此操作的代码。

        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 类中,则可以在此处设置单击或使用回调。

        奖金

        这也是正确的做法。

        【讨论】:

          【解决方案6】:

          要么使用Fragments

          试试 autoSizeText

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

          Android 开发者 site 上关于它的一些事情

          【讨论】:

            猜你喜欢
            • 2018-09-26
            • 1970-01-01
            • 1970-01-01
            • 2016-06-10
            • 1970-01-01
            • 1970-01-01
            • 2022-01-02
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多