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

Java 如何在屏幕大小更改时动态管理TextView的位置,java,android,xml,textview,android-linearlayout,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" andr

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

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>
任用

试试autoSizeText

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

以下是关于android开发者的一些信息

或者使用

试试autoSizeText

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


以下是android developer上的一些内容

为了满足您的需求,您不必使用两个文本视图。您可以在一个文本上放置一个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);
下面是在文本视图上放置不同跨距的示例


如何在单个文本视图上设置两个跨距?根据您的要求,您不必使用两个文本视图。为此,您可以在一个文本上放置一个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);
下面是在文本视图上放置不同跨距的示例


如何在单个文本视图上设置两个跨距

您可以使用值文件夹根据屏幕大小设置文本视图字体大小或宽度

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

相同的问题或来源

相同的问题或来源

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

if ((height == <value>) && (width == <value>)) {
setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
if((高度==)&&(宽度==)){
setRequestedOrientation(ActivityInfo.SCREEN\u ORIENTATION\u Picture);
}
*您可以在活动中根据需要随意修改

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

if ((height == <value>) && (width == <value>)) {
setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
if((高度==)&&(宽度==)){
setRequestedOrientation(ActivityInfo.SCREEN\u ORIENTATION\u Picture);
}

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

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

下面是执行此操作的代码

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());
        }
    }
}
public void setHighLightedText(TextView TextView,String textToHighlight){
字符串tvt=textView.getText().toString();
intofe=tvt.indexOf(textToHighlight,0);
ClickableSpan ClickableSpan=新的ClickableSpan(){
@凌驾
公共void onClick(查看文本视图){
//这是你做的所有事情
}
@凌驾
public void updateDrawState(TextPaint ds){
super.updateDrawState(ds);
ds.setColor(0xff0000ff);
ds.setUnderlineText(true);
//在这里,您可以将您的样式放在textview上。
}
};
SpannableString wordtoSpan=新的SpannableString(textView.getText());
对于(intofs=0;ofs
您可以在其中看到
onClick
方法。若将此代码放入实用程序类中,则可以在那个里设置click或UseCallback

奖金


这也是正确的方法。

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

下面是执行此操作的代码

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());
        }
    }
}
public void setHighLightedText(TextView TextView,String textToHighlight){
字符串tvt=textView.getText().toString();
intofe=tvt.indexOf(textToHighlight,0);
ClickableSpan ClickableSpan=新的ClickableSpan(){
@凌驾
公共void onClick(查看文本视图){
//这是你做的所有事情
}
@凌驾
public void updateDrawState(TextPaint ds){
super.updateDrawState(ds);
ds.setColor(0xff0000ff);
ds.setUnderlineText(true);
//在这里,您可以将您的样式放在textview上。
}
};
SpannableString wordtoSpan=新的SpannableString(textView.getText());
对于(intofs=0;ofs
您可以在其中看到
onClick
方法。若将此代码放入实用程序类中,则可以在那个里设置click或UseCallback

奖金


这也是正确的方法。

我认为这是自动发生的。。。这取决于空间,若它有足够的空间,那个么它将像第一个屏幕一样,我认为它会自动发生。。。它取决于空间,如果它有足够的空间,那么它将像第一个屏幕一样。为什么
ForegroundColorSpan
不会改变?我使用了res文件中的一种颜色,但它总是显示蓝色?下面是代码
int color=getResources().getColor(R.color.colorPrimary);ForegroundColorSpan fcs=新的ForegroundColorSpan(颜色);stringBuilder.setSpan(fcs,termsTxt.getText().length()-20,termsTxt.getText().length(),SPAN.SPAN_EXCLUSIVE_EXCLUSIVE)
int color=ContextCompat.getColor(context,R.color.your_color);还是一样。。!我在更新1中发布了完整的代码。请看一看。为什么
前景颜色span
不会改变?我用了一种来自我的re的颜色