java - 展開可能なレイアウトが画面の外に出た場合にレイアウトを表示する ScrollView

okwaves2024-01-25  200

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

総合生活情報サイト - OKWAVES
総合生活情報サイト - OKWAVES
生活総合情報サイトokwaves(オールアバウト)。その道のプロ(専門家)が、日常生活をより豊かに快適にするノウハウから業界の最新動向、読み物コラムまで、多彩なコンテンツを発信。