ScrollView中的Scrollto方法无法正常工作

时间:2017-07-27 08:10:22

标签: android

我有一个Linearlayouts,一个ScrollView和一个按钮,我无法弄清楚为什么当我以编程方式将一个Checkbox添加到Linearlayout时,在视图的末尾,来自scrollview的方法

scrollview.scrollto(0, ScrollView.FOCUS_DOWN);

不会关注最后添加的项目。

这里是XML

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:weightSum="100"
    tools:context="com.eidotab.myapplication.MainActivity">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:orientation="vertical"
        android:padding="10dp"
        android:layout_weight="30">

        <ScrollView
            android:id="@+id/scroll"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <LinearLayout
                android:id="@+id/linear"
                android:gravity="center"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="vertical">
            </LinearLayout>

        </ScrollView>

    </LinearLayout>

    <Button
        android:id="@+id/boton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:text="TEST"/>

</LinearLayout>

这里是java:

public class MainActivity extends AppCompatActivity {

    ScrollView scrollView;
    LinearLayout linearLayout;
    Button button;

    int num = -1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        scrollView = (ScrollView) findViewById(R.id.scroll);
        linearLayout = (LinearLayout) findViewById(R.id.linear);
        button = (Button) findViewById(R.id.boton);

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                num++;
                CheckBox checkBox = new CheckBox(getApplicationContext());
                checkBox.setText("TEST " + num);
                checkBox.setTextColor(Color.BLACK);
                linearLayout.addView(checkBox);

               scrollView.fullScroll(ScrollView.FOCUS_DOWN);
            }
        });
    }
}

我也添加了.rar,所以你只需要下载并尝试它..我花了几个小时试图让它工作..也尝试从LinearLayout获取具体的孩子

 y = Linearlayout.getchildat(N).getBottom();

和FOCUS_DOWN类似......我永远看不到最后一个项目..只有最后一个项目。

提前感谢您的帮助。

这是程序

https://www.dropbox.com/home/Public?preview=MyApplication.rar

1 个答案:

答案 0 :(得分:0)

经过一些研究后,在尝试以编程方式执行滚动时似乎存在某种问题,我发现最好的解决方案是在我的代码中在onClick方法中添加一个runable,所以我添加了

scrollView.post(new Runnable() {
                @Override
                public void run() {
                    scrollView.fullScroll(ScrollView.FOCUS_DOWN);
                }
            });

,最终结果是

 button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                num++;
                CheckBox checkBox = new CheckBox(getApplicationContext());
                checkBox.setText("TEST " + num);
                checkBox.setTextColor(Color.BLACK);
                linearLayout.addView(checkBox);

               //scrollView.fullScroll(ScrollView.FOCUS_DOWN);

                scrollView.post(new Runnable() {
                    @Override
                    public void run() {
                        scrollView.fullScroll(ScrollView.FOCUS_DOWN);
                    }
                });
            }
        });

它现在正在完美地工作,但是说,我不认为这是理想的解决方案。