ふわふわぷかぷか

javaって何?から始めた初心者のandroidアプリ開発メモ。でも最近はイラレにはまってます。

テキストビューに長文を入力すると変な所で改行される。

こんなアプリを作ってます♪

f:id:fuwafuwapukapuka:20150219214344p:plain f:id:fuwafuwapukapuka:20150219214448j:plain f:id:fuwafuwapukapuka:20150223222756p:plain

 

テキストビューに長文を入力したら、変な所で改行されてしまいました。

画面の右端で全部きれいに改行してほしくて、こちらを参考にしたらできました。

 

クラスの内容を反映してくれる、オリジナルのテキストビューを作って、クラスで改行の設定をするみたいです。

 <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);
        }
    }
}

 

普通(左)にテキストビューに表示すると、おかしな所で改行されますが、この方法(右)だと右端でそろえて改行できました。

f:id:fuwafuwapukapuka:20140326214835p:plain  f:id:fuwafuwapukapuka:20140326214853p:plain