テキストビューに長文を入力すると変な所で改行される。
こんなアプリを作ってます♪
テキストビューに長文を入力したら、変な所で改行されてしまいました。
画面の右端で全部きれいに改行してほしくて、こちらを参考にしたらできました。
クラスの内容を反映してくれる、オリジナルのテキストビューを作って、クラスで改行の設定をするみたいです。
<TextViewのところを、 <「アプリのパッケージ名」.「クラスのファイル名」にするとできるみたいです。
main.xmlは、
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#ffffff"
android:orientation="vertical" >
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="ボタン" />
<jp.hews.helloandroid.WrapTextView
android:id="@+id/text1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:lineSpacingMultiplier="1.6"
android:textSize="16dp" />
</LinearLayout>
android:lineSpacingMultiplier="1.6"は行間をしていしています。
android:textSize="16dp"は文字のサイズです。
ボタンを押したらテキストビューに文字が表示されるようにします。
string.xmlにテキストビューに表示する内容を入れます。
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">ふわふわぷかぷか</string>
<string name="yasai">赤かぶ、アスパラ、アボカド、いんげんまめ、えだまめ、えのき、エリンギ、オクラ、かぶ、かぼちゃ、キャベツ、きゅうり、ごぼう、小松菜、さつまいも、里芋、さやえんどう、しいたけ、自然薯、しめじ、じゃがいも、春菊、しょうが、ズッキーニ、せり、セロリ、大根、たけのこ、玉ねぎ、チンゲン菜、とうもろこし、トマト、長芋、なす、にがうり(ゴーヤ)、にら、にんじん、にんにく、ねぎ、白菜、パセリ、パプリカ、ピーマン、ふき、ブロッコリー、ほうれん草、みずな、ミニトマト、もやし、レタス、れんこん</string>
</resources>
改行を設定するために、クラスを2つ作ります。(Activityを作るのと同じ場所)
①WrapTextView.java
package jp.hews.helloandroid;
import android.content.Context;
import android.text.InputFilter;
import android.util.AttributeSet;
import android.widget.TextView;
public class WrapTextView extends TextView{
private CharSequence mOrgText = "";
private BufferType mOrgBufferType = BufferType.NORMAL;
public WrapTextView(Context context) {
super(context);
setFilters(new InputFilter[] { new WrapTextViewFilter(this) });
}
public WrapTextView(Context context, AttributeSet attrs) {
super(context, attrs);
setFilters(new InputFilter[] { new WrapTextViewFilter(this) });
}
public WrapTextView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
setFilters(new InputFilter[] { new WrapTextViewFilter(this) });
}
@Override
protected void onLayout(boolean changed, int left, int top, int right,
int bottom) {
setText(mOrgText, mOrgBufferType);
}
@Override
public void setText(CharSequence text, BufferType type) {
mOrgText = text;
mOrgBufferType = type;
super.setText(text, type);
}
@Override
public CharSequence getText() {
return mOrgText;
}
@Override
public int length() {
return mOrgText.length();
}
}
②WrapTextViewFilter.java
package jp.hews.helloandroid;
import android.text.InputFilter;
import android.text.Layout;
import android.text.SpannableStringBuilder;
import android.text.Spanned;
import android.text.TextPaint;
import android.widget.TextView;
public class WrapTextViewFilter implements InputFilter {
private final TextView view;
public WrapTextViewFilter(TextView view) {
this.view = view;
}
//@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
TextPaint paint = view.getPaint();
int w = view.getWidth();
int wpl = view.getCompoundPaddingLeft();
int wpr = view.getCompoundPaddingRight();
int width = w - wpl - wpr;
SpannableStringBuilder result = new SpannableStringBuilder();
for (int index = start; index < end; index++) {
if (Layout.getDesiredWidth(source, start, index + 1, paint) > width) {
result.append(source.subSequence(start, index));
result.append("\n");
start = index;
} else if (source.charAt(index) == '\n') {
result.append(source.subSequence(start, index));
start = index;
}
}
if (start < end) {
result.append(source.subSequence(start, end));
}
return result;
}
}
最後に、Activityでボタンを押したら文字が表示されるようにします。
ボタンを押したときにstring.xmlから文字列を読み込んでテキストビューに表示します。
public class HelloandroidActivity extends Activity implements OnClickListener {
Button button1;
TextView tv1;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
tv1 = (TextView) findViewById(R.id.text1);
button1 = (Button) findViewById(R.id.button1);
button1.setOnClickListener(this);
}
public void onClick(View v) {
if (v == button1) {
String str_yasai = getString(R.string.yasai);
tv1.setText(str_yasai);
}
}
}
普通(左)にテキストビューに表示すると、おかしな所で改行されますが、この方法(右)だと右端でそろえて改行できました。
はじめてのAndroidアプリ作成 クラウドアプリ開発 (はじめてのAndroidアプリ作成 シリーズ)
- 作者: 末次章
- 出版社/メーカー: 日経BP社
- 発売日: 2013/11/28
- メディア: 単行本
- この商品を含むブログを見る