【教えてください】textviewの一文字削除について

2,608 views
Skip to first unread message

Yasu

unread,
Jan 5, 2013, 11:18:39 AM1/5/13
to android-g...@googlegroups.com
こんばんは、Yasuです。
 
再度教えて頂いてよろしいでしょうか。
 
ボタンをクリックすると以下の関数を組み込んでいます。
 
public void onBackSpaceClick(View view) {
     TextView textview = (TextView) findViewById(R.id.textView1);
 
     //一文字だけ消すボタンが押された時の動作
     SpannableStringBuilder backspace = new SpannableStringBuilder();
     backspace = (SpannableStringBuilder)textview.getText();
     if(backspace.length() > 0)
     {
         backspace.delete(backspace.length()-1,backspace.length());
         textview.setText(backspace.toString());
     }
 }
textviewの最終文字列を一文字消すだけのプログラムですが、
アプリ起動直後、textviewに文字が無い状態で、ボタンを押下すると
アプリが落ちます。文字があった場合は、最後の一文字を削除してくれます。
 
アプリ起動直後、textviewに文字が無い状態で、ボタンを押下してもアプリが落ちない方法が
理解できておりません。
 
どなたかご教授願えませんでしょうか。
 
よろしくお願いいたします。
 
 

勝田泰彰

unread,
Jan 5, 2013, 9:38:30 PM1/5/13
to android-g...@googlegroups.com
つぶあんころいど様
 
返信有難う御座います。
お教えいただきましたif(backspace != null && 0 < backspace.length())にて
試しましたが、やっぱりアプリが落ちてしまいます。
 
Logcatで落ちた原因を解明しているところですが、よく分かっておりません。。。
 
01-06 02:32:51.399: E/AndroidRuntime(537): FATAL EXCEPTION: main
01-06 02:32:51.399: E/AndroidRuntime(537): java.lang.IllegalStateException: Could not execute method of the activity
01-06 02:32:51.399: E/AndroidRuntime(537):  at android.view.View$1.onClick(View.java:3039)
01-06 02:32:51.399: E/AndroidRuntime(537):  at android.view.View.performClick(View.java:3480)
01-06 02:32:51.399: E/AndroidRuntime(537):  at android.view.View$PerformClick.run(View.java:13983)
01-06 02:32:51.399: E/AndroidRuntime(537):  at android.os.Handler.handleCallback(Handler.java:605)
01-06 02:32:51.399: E/AndroidRuntime(537):  at android.os.Handler.dispatchMessage(Handler.java:92)
01-06 02:32:51.399: E/AndroidRuntime(537):  at android.os.Looper.loop(Looper.java:137)
01-06 02:32:51.399: E/AndroidRuntime(537):  at android.app.ActivityThread.main(ActivityThread.java:4340)
01-06 02:32:51.399: E/AndroidRuntime(537):  at java.lang.reflect.Method.invokeNative(Native Method)
01-06 02:32:51.399: E/AndroidRuntime(537):  at java.lang.reflect.Method.invoke(Method.java:511)
01-06 02:32:51.399: E/AndroidRuntime(537):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
01-06 02:32:51.399: E/AndroidRuntime(537):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
01-06 02:32:51.399: E/AndroidRuntime(537):  at dalvik.system.NativeStart.main(Native Method)
01-06 02:32:51.399: E/AndroidRuntime(537): Caused by: java.lang.reflect.InvocationTargetException
01-06 02:32:51.399: E/AndroidRuntime(537):  at java.lang.reflect.Method.invokeNative(Native Method)
01-06 02:32:51.399: E/AndroidRuntime(537):  at java.lang.reflect.Method.invoke(Method.java:511)
01-06 02:32:51.399: E/AndroidRuntime(537):  at android.view.View$1.onClick(View.java:3034)
01-06 02:32:51.399: E/AndroidRuntime(537):  ... 11 more
01-06 02:32:51.399: E/AndroidRuntime(537): Caused by: java.lang.ClassCastException: java.lang.String cannot be cast to android.text.SpannableStringBuilder
01-06 02:32:51.399: E/AndroidRuntime(537):  at testi.study.character.Moji.onBackSpaceClick(Moji.java:75)
01-06 02:32:51.399: E/AndroidRuntime(537):  ... 14 more


2013年1月6日 4:05 つぶあんころいど <tsubua...@gmail.com>:
こんばんわ。初投稿になりますつぶあんころいどと申します。
 
TextViewが文字がない状態のときアプリが落ちるとのことですが、logcatで具体的にどこでどんなexceptionが出ているか確認されたほうがいろんなことに対して近道になると思います。
 
ソースを見ただけで、実際には試していませんが
if(backspace.length() > 0)
ここで NullPointerException が出てるだけじゃないでしょうか。
TextView に文字がないという状況ですが、TextView に限らず String でもなんでもそうですが、文字がない状態というのは2種類あり、本当に何もない(参照先のない) null の場合と、文字がない場合 (length=0) があります。どちらも人間的には文字がないように思いがちですが、何もないのと、何も文字がないのは違います。
 
よって落ちない(例外が発生しない)ようにするためには、if分の条件式を
if(backspace != null && 0 < backspace.length())
にすればよいかと思われます。おためしください。

--
このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
このディスカッションをウェブ上で閲覧するには、https://groups.google.com/d/msg/android-group-japan/-/No-hZcS9iK8J にアクセスしてください。

このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
このグループから退会するには、android-group-j...@googlegroups.com にメールを送信してください。
詳細については、http://groups.google.com/group/android-group-japan?hl=ja からこのグループにアクセスしてください。

つぶあんころいど

unread,
Jan 6, 2013, 12:33:26 AM1/6/13
to android-g...@googlegroups.com
つぶあんころいどでございます。
 
実際にコーディングして試してみましたので、ご報告です。
まず、先に提示させていただきました
if(backspace != null && 0 < backspace.length())
ですが、SpannableStringBuilder型が文字列が空であってもnull値を返すことは無いようですので、nullチェックは無意味でした。ごめんなさい。
 
Yasuさんの onBackSpaceClick(View v) を実装させていろいろ試してみましたところ、アプリ起動時にtextView1が空だと落ちるという認識が間違っていました。自分は逆にアプリ起動時にtextView1が"Hello World!"であってもClassCastExceptionが出てしまい少々混乱してしまいました。文字列の有無ではなく、初回起動時が問題のようです。これが仕様によるものなのかバグによるものなのかは判断できませんが、textView1に空の文字列を追記することで回避できるようになりました。スマートではない気がしますが…
空の文字列を追記することで、アプリ起動直後であっても、textView1を書き換えた後の状態にしています。
所望の動作はしていると思いますが、いかがでしょうか。
 
   public void onBackSpaceClick(View view) {
        TextView textview = (TextView) findViewById(R.id.textview1);
        textview.append("");    //空の文字列を追記する

Yasu

unread,
Jan 6, 2013, 12:54:37 AM1/6/13
to android-g...@googlegroups.com
つぶあんころいど様
 
コーディングまでして頂き、誠にありがとうございました。
意図した動きとなっております。
 
私が考えていた方法は
1.if文を2つに分け、stringとlengthでデータを取得し、lengthで削除と考えておりました。
 
ありがとうございました。

2013年1月6日日曜日 14時33分26秒 UTC+9 つぶあんころいど:

つぶあんころいど

unread,
Jan 6, 2013, 1:05:01 AM1/6/13
to android-g...@googlegroups.com
つぶあんころいどでございます。
 
意図した動作になったとのことでなによりです。
 
自分は SpannableStringBuilder型を使っている意図がよくわかりませんでしたので、下記のようにも考えました。
こちらでも所望の動作となります。ご参考まで。
 
    public void onBackSpaceClick(View view) {
        TextView textview = (TextView) findViewById(R.id.textview1);
        CharSequence c = textview.getText();
        if(0 < c.length()){
         textview.setText(c.subSequence(0, c.length() - 1));
        }
    }

田代透

unread,
Jan 6, 2013, 1:50:57 AM1/6/13
to android-g...@googlegroups.com
String backspace = textview.getText().toString();
textview.setText(backspace.substring(0, backspace.length()-1));
では、なにかまずいのでしょうか?

また、
SpannableStringBuilder backspace = new SpannableStringBuilder();
とnewしているのに
backspace = (SpannableStringBuilder)textview.getText();
と、代入して上書きしちゃってるのも変じゃないですか?

logcatを見ると
java.lang.ClassCastException: java.lang.String canot be cast to android.text.SpannableStringBuilder
とエラーが出ています

backspace.append(textview.getText());
とすればエラーはないと思いますけど、意味はありますか?

ココはみておいたほうがよいかと
TextView
ではgetText()はCharSequenceを返すと記述されているし

EditView
ではgetText()はEditableを返すと記述されています。





2013年1月6日 14:33 つぶあんころいど <tsubua...@gmail.com>:
--
このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
このディスカッションをウェブ上で閲覧するには、https://groups.google.com/d/msg/android-group-japan/-/cU5rUnpVnQUJ にアクセスしてください。

このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
このグループから退会するには、android-group-j...@googlegroups.com にメールを送信してください。
詳細については、http://groups.google.com/group/android-group-japan?hl=ja からこのグループにアクセスしてください。



--
--
Toru Tashiro
toru...@gmail.com
Reply all
Reply to author
Forward
0 new messages