●TextViewにスクロールを付ける

テキストビューにスクロールを付けるにはTextView自体の機能を使う場合とXMLでScrollViewで囲む場合と。
javaのコードで書く方法があります。

javaのコードで書く方法を考えます。

その他の方法はこちらで

まず、テキストビューのサイズがいっぱいに広がるようリニアレイアウトに配置します。
そのリニアレイアウトをスクロールビューに配置して、画面表示するとスクロールビューにスクロールバーが表示されます。

要するに、でっかいTextViewがScrolViewの中にあってそれをScrollViewでスクロールしているというイメージですね。
別にTextViewでなくても他のレイアウトでもスクロールできます。

問題として、画面を切り替えたりするとスクロールの位置がリセットされてしまうため、
保存・復元する必要があります。

保存・復元する箇所は赤字になっています。
Androidのバージョンによって動作が違うためごちゃごちゃしていますが。


public class MainActivity extends AppCompatActivity {
    android.widget.ScrollView sv;
    static int x,y;
    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        sv =new android.widget.ScrollView(this);
        android.widget.LinearLayout ll=new android.widget.LinearLayout(this);
        android.widget.TextView tv=new android.widget.TextView(this);
        sv.addView(ll);
        ll.addView(tv);
        setContentView(sv);

        tv.setText("0\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n" +
                "16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n" +
                "30\n31\n32\n33\n34\n35\n36\n37\n38\n39\n40");
            sv.post(new Runnable() {
                public void run() {
                    sv.setScrollX(x);
                    sv.setScrollY(y);
                    sv.scrollTo(x, y);
                }
            });
    }
    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        x=sv.getScrollX();
        y=sv.getScrollY();
    }
}




実際に上のプログラムを実行してみると、


縦横傾けたり、他の画面に切り替えて戻ってきてもスクロール位置が復元されます。


次に、縦だけでなく横にもスクロール出来るようにしたいと思います。
ScrollViewの中に横向きスクロールのHorizontalScrollViewを入れるととりあえず縦と横のスクロールができるはずです。


public class MainActivity extends AppCompatActivity {
    android.widget.ScrollView sv;
    android.widget.HorizontalScrollView hsv;
    static int vx,vy,hx,hy;
    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        sv =new android.widget.ScrollView(this);
        hsv=new android.widget.HorizontalScrollView(this);
        android.widget.LinearLayout ll=new android.widget.LinearLayout(this);
        android.widget.TextView tv=new android.widget.TextView(this);
        sv.addView(hsv);
        hsv.addView(ll);
        ll.addView(tv);
        setContentView(sv);


        tv.setText("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +
                "\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n" +
                "16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n" +
                "30\n31\n32\n33\n34\n35\n36\n37\n38\n39\n40");

            sv.post(new Runnable() {
                public void run() {
                    sv.setScrollX(vx);
                    sv.setScrollY(vy);
                    hsv.setScrollX(hx);
                    hsv.setScrollY(hy);
                    sv.scrollTo(vx, vy);
                    hsv.scrollTo(hx, hy);
                }
            });


    }
    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        vx=sv.getScrollX();
        vy=sv.getScrollY();
        hx=hsv.getScrollX();
        hy=hsv.getScrollY();
    }
}

横向きもしくは縦向きのどちらかづつのスクロールはできましたが、斜め向きはできませんでした。
あと、縦向きスクロールの中に横向きスクロールを入れたため、
横向きスクロールは縦向きスクロールを一番下にもってきた時しか表示されません。



▲トップページ > android