●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