如果可扩展布局超出屏幕,则 ScrollView 显示布局

Posted

技术标签:

【中文标题】如果可扩展布局超出屏幕,则 ScrollView 显示布局【英文标题】:ScrollView to show layout if expandable layout goes outside the screen 【发布时间】:2020-12-22 15:35:36 【问题描述】:

我的 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_
            android:layout_
            android:orientation="vertical">

            <LinearLayout
                android:id="@+id/box_header"
                android:layout_
                android:layout_
                android:orientation="horizontal">

                <TextView
                    android:id="@+id/textID"
                    android:layout_
                    android:layout_
                    android:text="title"
                    android:textColor="#ffffff"
                    android:textSize="16sp"/>

            </LinearLayout>

            <net.cachapa.expandablelayout.ExpandableLayout
                android:id="@+id/expandable_layout1"
                android:layout_
                android:layout_
                app:el_duration="1000"
                app:el_expanded="false"
                app:el_parallax="0.5">

                
                <TextView
                    android:layout_
                    android:layout_
                    android:text="some text"
                    android:textColor="#ffffff"
                    android:textSize="12sp"/>
                
            </net.cachapa.expandablelayout.ExpandableLayout>

        </LinearLayout>

【问题讨论】:

【参考方案1】:

您面临的问题是 ExpandableLayout 在 ScrollView 滚动到底部之前没有时间完成打开。所以最终发生的是 ScrollView 滚动到尚未完全打开的 ExpandableLayout 的底部。您需要做的是在 Layout 打开和 ScrollView 启动它的滚动功能之间添加延迟。这是您需要的代码,我会尝试调整毫秒,您可能会将它们降低到 1000 以下,但不会降低太多,但您仍然需要对其进行一些故障排除以使其更快和更顺畅一点。也可以尝试使用 smoothScrollTo 而不是 scrollTo。

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

【讨论】:

以上是关于如果可扩展布局超出屏幕,则 ScrollView 显示布局的主要内容,如果未能解决你的问题,请参考以下文章

010-Android开发解决控件超出屏幕,不能正常显示的问题

可滚动父版面内的不可滚动ListView

Android ScrollView

android ScrollView+GridView GridView不滚动

ScrollView 内不可滚动的 ListView

如果将 Webview 作为子项,则布局 onClick 事件不起作用