2017-11-25 11 views
1

1つの水平レイアウトに2つのテキストビューがあります。最初のテキストは通常​​のテキストで、2番目のテキストビューは異なる色でクリックできます。画面サイズが変更されたときにTextViewsの位置を動的に管理する方法

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は奇妙な取得を与えます。!私はそれが自動的に最初の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); 
    } 
+0

私はそれが自動的に起こると思います...それは十分なスペースがあればそれは最初の画面のようになるでしょう –

答えて

1

ですあなたはこのために2つのテキストビューを使用する必要はありませんspannable文字列ビルダーを1つのテキストに置き、clickableとcolorプロパティを入れれば完了です。

コード:ここで

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); 

Thisは、単一のテキストビュー上の2つのスパンを設定する方法であるテキストビュー上の異なるスパンを置くのexampleある

+0

なぜ '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); –

+0

int color = ContextCompat.getColor(context、R.color.your_color); –

+0

と同じです!私はUpdate#1に完全なコードを掲載しました。見てください。 –

0

ここでもautoSizeText

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

を試してみてくださいFragments

OR

を使用するには、あなたのR用のAndroid開発者にそれについて何かsite

1

あなたはTextViewのフォントサイズを設定することができますまたは値のフォルダを使用して画面のサイズに応じて幅。 Try like this

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); 
} 

*フィールにあなたの活動で必要に応じて自由に変更することができます

1

最も簡単な方法これを行うための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クラスに置くと、クリックまたはコールバックを設定できます。

ボーナスもこれはこれを行うには正しい方法です。

関連する問題