Android TextViewは、テキスト内容が表示省略記号を超えているかどうかを判断する
2022-02-18 19:38:53
TextViewはテキストがellipsisを越えているかどうかを判断する
最近、Qzoneのソーシャルサークルに似たモジュールに取り組んでいます。ある要件は、ユーザーが4行以上の内容を投稿したときにボタンを表示し、ボタンをクリックすると全文が表示されることです。TextViewは、テキストコンテンツに省略記号が表示されていないことを取得するメソッドを持っていることが本当に見つかりませんでした。仕方なく自分で考えてみました。
-
アイデア・想い
textviewは勝手に楕円を表示するので、コンテンツが最大行数を超えているかどうかを判断する内部アルゴリズムがあるはずですが、このメソッドを見つけるか、このメソッドの戻り値を見つけることができますか?
答えはイエスで、TextViewにはメソッド getLayout()を使用します。 このLayoutオブジェクトには、メソッド
/**
* Returns the number of characters to be ellipsized away, or 0 if
* no ellipsis is to take place.
*/
public abstract int getEllipsisCount(int line);
省略された文字の数を取得することができます。0を返せば、省略がないことを意味します。そして、この戻り値から、テキストが省略されているかどうかを判断することができます。
デモ
- MainActivityです。TextView、テキストをクリックすると折りたたまれ、すべて表示されるButton。
public class MainActivity extends AppCompatActivity {
/**
* Display up to 2 lines.
*/
private static final int LINES = 2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final TextView textView = findViewById(R.id.tv);
findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// get the number of omitted characters, 0 means no and omitted
int ellipsisCount = textView.getLayout().getEllipsisCount(textView.getLineCount() - 1);
textView.getLayout().getEllipsisCount(textView.getLineCount() - 1);
//ellipsisCount>0 means that not all of them are displayed and there are omitted parts.
if (ellipsisCount > 0) {
//Show all, button is set to click to close.
textView.setMaxHeight(getResources().getDisplayMetrics().heightPixels);
((TextView) findViewById(R.id.btn)).setText("put away");
} else {
//Show 2 rows, button set to show all on click.
((TextView) findViewById(R.id.btn)).setText("Show All"));
textView.setMaxLines(LINES);
}
}
});
}
}
- レイアウト
-
備考
onCreateメソッド内でtextView.getLayout()を直接呼び出すと、nullを返す場合があります。textViewが描画された後に呼び出すとよいでしょう。
textView.post(new Runnable() {
@Override
public void run() {
//Get the number of characters omitted, 0 means no and omitted
int ellipsisCount = textView.getLayout().getEllipsisCount(textView.getLineCount() - 1);
textView.getLayout().getEllipsisCount(textView.getLineCount() - 1);
}
});
-
を使ったリストでは
テキストが3行を超えたら省略記号を付けてリスト表示し、クリックすると全部表示されるようなニーズがあるとします。WeChatの友達の輪のようなものです。 -
アイデア:リストにテキストを設定した後、textView.getLayout()メソッドを直接呼ぶとnullが返ってくるので、非同期に取得する方法が必要なので、全部表示されているか、テキストは範囲外か、などの情報を保持するデータモデルが必要です。
-
DEMO
public class TestListActivity extends AppCompatActivity {
/**
* Display up to 3 rows.
*/
private static final int LINES = 3;
/**
* Data
*/
private List<DataModel> data = new ArrayList<>();
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test_list);
RecyclerView mRecyclerView = findViewById(R.id.rv);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false));
String temp = "Display up to 3 rows. ";
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 20; i++) {
sb.append(temp);
data.add(new DataModel(null, sb.toString()));
}
mRecyclerView.setAdapter(new RecyclerView.Adapter<RecyclerView.ViewHolder>() {
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return new RecyclerView.ViewHolder(LayoutInflater.from(TestListActivity.this).inflate(R.layout.activity_main, parent, false)) {
};
}
@Override
public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) {
holder.itemView.findViewById(R.id.btn_list_demo).setVisibility(View.GONE);
final TextView textView = holder.itemView.findViewById(R.id.tv);
final DataModel model = data.get(position);
textView.setText(model.text);
// save the state of the text first
if (model.hasEllipsis == null) {
//If textView.getLayout() is null, retrieve the Layout object when the TextView is finished rendering.
textView.post(new Runnable() {
@Override
public void run() {
int ellipsisCount = textView.getLayout().getEllipsisCount(textView.getLineCount() - 1);
//Is it out of range: if the line count is greater than 3 or ellipsisCount>0 is out of range, an ellipsis will be displayed.
if (model.hasEllipsis == null) {
model.hasEllipsis = ! (textView.getLineCount() <= LINES && ellipsisCount == 0);
}
// Hide the button if the text is not out of range.
holder.itemView.findViewById(R.id.btn).setVisibility(model.hasEllipsis ? View.VISIBLE : View.GONE);
// If or not all the text is shown.
model.isShowAll = ellipsisCount > 0;
setTextViewLines(textView, ((TextView) holder.itemView.findViewById(R.id.btn)), !model.hasEllipsis || model.isShowAll);
}
});
} else {
holder.itemView.findViewById(R.id.btn).setVisibility(model.hasEllipsis ? View.VISIBLE : View.GONE);
setTextViewLines(textView, ((TextView) holder.itemView.findViewById(R.id.btn)), !model.hasEllipsis || model.isShowAll);
}
holder.itemView.findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
model.isShowAll = !model.isShowAll;
notifyItemChanged(po
レイアウト:RecyclerViewは1つだけ
Code.
https://github.com/gentlemanyc/TestTextView/tree/master
関連
-
adb シェルがデバイスのオフラインを求めるプロンプトを表示する
-
AndroidStudio reports Could not resolve all artifacts for configuration ':app:classpath'.
-
RuntimeException: アクティビティを開始できません ComponentInfo solution
-
問題 ---- Android ---- ActivityManager: Error: アクティビティクラス{xx/xx.MainActivity}が存在しない
-
Android Bluetooth 開発の基本プロセス
-
android bluetooth--Bluetooth on、検索、ペアリング、接続
-
Android--shape--描画のコーナー、グラデーション、パディング、サイズ、ソリッド、ストロークのプロパティを指定する。
-
アンドロイドシェイプ、グラデーション、角丸、ボーダーラインの設定
-
Android studio 制約レイアウト ConstraintLayout
-
AndroidサポートデザインライブラリのFloatingActionButtonについて
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Android端末にADBが接続できない!を解決。理由: デバイスが認証されていない!
-
[android studio]com.android.ide.common.process.ProcessException: aaptの実行に失敗しました
-
プログラム "git.exe "を実行できない場合の正しい解決方法です。CreateProcessエラー=2
-
android:EMSのプロパティ
-
超シンプルなアンドロイドのタイムディレイ機能
-
アプリの実行エラー。ターゲットデバイスが見つからない問題
-
Android Studio常见错误之:Rendering Problems/The following classes could not be instantiated
-
CursorIndexOutOfBoundsException:インデックス -1 が要求されました。
-
AndroidManifest.xmlの最も完全な詳細な説明
-
android.view.inflateexception 例外処理