Android アプリには拡張可能なレイアウトがいくつかあります。クリックしてレイアウトを展開すると、レイアウトが画面の外に消えてしまうため、表示するには手動で下にスクロールする必要があります。 ScrollView を自動的に下にスクロールして、クリックしたレイアウトを表示するにはどうすればよいですか?
scrollView.scrollTo(0, textID.getBottom()); を使ってみました。レイアウト要素の一番下までスクロールしようとしましたが、うまくいきませんでした。
Java:
expandableLayout1 = root.findViewById(R.id.expandable_layout1);
button = (LinearLayout)root.findViewById(R.id.box_header);
button.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View view) {
if (expandableLayout1.isExpanded()) {
expandableLayout1.collapse();
} else {
expandableLayout1.expand();
scrollView.scrollTo(0, textID.getBottom());
}
}
});
xml:
<LinearLayout
android:id="@+id/box"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout
android:id="@+id/box_header"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<TextView
android:id="@+id/textID"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="title"
android:textColor="#ffffff"
android:textSize="16sp"/>
</LinearLayout>
<net.cachapa.expandablelayout.ExpandableLayout
android:id="@+id/expandable_layout1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:el_duration="1000"
app:el_expanded="false"
app:el_parallax="0.5">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="some text"
android:textColor="#ffffff"
android:textSize="12sp"/>
</net.cachapa.expandablelayout.ExpandableLayout>
</LinearLayout>
------------------------
あなたが直面している問題は、ScrollView がすでに一番下までスクロールする前に ExpandableLayout を開き終える時間がないことです。それの。したがって、最終的に何が起こるかというと、ScrollView はまだ完全には開いていない ExpandableLayout の一番下までスクロールします。必要なのは、Layout が開いてから ScrollView がスクロール機能を開始するまでの間に遅延を追加することです。必要なコードは次のとおりです。ミリ秒を調整してみます。おそらく 1000 未満に下げることもできますが、それほど大きくはなりません。それでも、少しだけ高速かつスムーズにするためにトラブルシューティングを行うのはあなた次第です。また、scrollTo の代わりに、smoothScrollTo を使用してみてください。
expandableLayout1 = root.findViewById(R.id.expandable_layout1);
button = (LinearLayout)root.findViewById(R.id.box_header);
button.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View view) {
if (expandableLayout1.isExpanded()) {
expandableLayout1.collapse();
} else {
expandableLayout1.expand();
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
scrollView.post(new Runnable() {
@Override
public void run() {
scrollView.scrollTo(0, textID.getBottom());
}
});
}
}, 1000 ); // time in milliseconds
}
}
});
ここに私が未加工の形式で追加したコードを示します。これを理解するのに少し役立つかもしれません。
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
// do something
}
}, 1000 ); // time in milliseconds