[Android]TextView の getEditableText が null を返す
TextViewで表示する文字列を装飾していて、そこから getEditableText() を使用して装飾情報ごと Editable型で抽出しようとしたのですが、nullが返ってきて装飾情報だけでなく文字列すら取得できない。。。
ドキュメントを見たら、こんな記載が。
https://developer.android.com/reference/android/widget/TextView.html#getEditableText()
テキストが編集可能でないとnullを返すのね。。。
なので、編集可能な EditText(TextViewを継承している)に変更したら無事 getEditableText() で装飾情報と文字列を取得することができました!!
一応、EditTextだと入力ができてしまったり、入力ボックスの枠が表示されたりするので、そこはTextViewのように振る舞うように以下を設定。
android:focusable="false"
android:background="#00000000"
フォーカスを当てないようにして、入力を不可にして、背景を設定して枠を非表示にしました。
これで、やりたいことはできました。
ドキュメントを見たら、こんな記載が。
https://developer.android.com/reference/android/widget/TextView.html#getEditableText()
Return the text the TextView is displaying as an Editable object. If the text is not editable, null is returned.
テキストが編集可能でないとnullを返すのね。。。
なので、編集可能な EditText(TextViewを継承している)に変更したら無事 getEditableText() で装飾情報と文字列を取得することができました!!
一応、EditTextだと入力ができてしまったり、入力ボックスの枠が表示されたりするので、そこはTextViewのように振る舞うように以下を設定。
android:focusable="false"
android:background="#00000000"
フォーカスを当てないようにして、入力を不可にして、背景を設定して枠を非表示にしました。
これで、やりたいことはできました。
[Android] ステータスバーの高さ
Navigation Drawer を使用したら、左からスライドして出てくるメニューとステータスバーが重なってしまった。。。
そこで、ステータスバーの高さを考慮したデザインを検討してみたが、ステータスバーの高さって幾つなんだろうと疑問が??
※ステータスバーは通知アイコンや時刻やバッテリー残量を表示する画面上部の領域
調べたらすぐにわかったけど、メモ。
結果は 24sp でした。
以下のガイドラインに記載されていました。
https://material.google.com/patterns/navigation-drawer.html#navigation-drawer-specs
Navigation Drawer がステータスバーと重なるのは、仕様?(推奨?)みたいですね。。。
ただ、Android4.4.2 の端末(ステータスバーが黒いやつ)だと、重ならないので、重なる考慮をしたレイアウトだと、また少し不自然になってしまうので、両方を考慮しないといけなく面倒ですね。。。
そこで、ステータスバーの高さを考慮したデザインを検討してみたが、ステータスバーの高さって幾つなんだろうと疑問が??
※ステータスバーは通知アイコンや時刻やバッテリー残量を表示する画面上部の領域
調べたらすぐにわかったけど、メモ。
結果は 24sp でした。
以下のガイドラインに記載されていました。
https://material.google.com/patterns/navigation-drawer.html#navigation-drawer-specs
Navigation Drawer がステータスバーと重なるのは、仕様?(推奨?)みたいですね。。。
ただ、Android4.4.2 の端末(ステータスバーが黒いやつ)だと、重ならないので、重なる考慮をしたレイアウトだと、また少し不自然になってしまうので、両方を考慮しないといけなく面倒ですね。。。
[Android]DialogFragmentでタイトルを非表示にする
DialogFragmentでカスタムダイアログを作成していて、タイトル表示が不要ななのにタイトル領域が表示されてしまうという現象が発生。
Dialog::setTitle() をしていなくても、タイトル表示領域が出てしまうという嬉しく無い仕様。。。
(ProgressDialogはタイトルをセットしなければ、表示されないのに・・・)
でも、ちゃんとタイトル領域表示させない方法は用意されています。
Dialog::requestWindowFeature() を使用して、パラメータに Window.FEATURE_NO_TITLE を指定してあげます。
これで、タイトル領域の表示はされなくなりますが、requestWindowFeature のタイミングに注意。
カスタムレイアウトをセットする前に呼び出さないと例外が発生します。
android.util.AndroidRuntimeException: requestFeature() must be called
【NGケース】
Dialog dialog = new Dialog(getActivity());
dialog.setContentView(R.layout.sample_layout);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); ← setContentViewの後に呼び出すと例外発生
【OKケース】
Dialog dialog = new Dialog(getActivity());
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setContentView(R.layout.sample_layout);
Dialog::setTitle() をしていなくても、タイトル表示領域が出てしまうという嬉しく無い仕様。。。
(ProgressDialogはタイトルをセットしなければ、表示されないのに・・・)
でも、ちゃんとタイトル領域表示させない方法は用意されています。
Dialog::requestWindowFeature() を使用して、パラメータに Window.FEATURE_NO_TITLE を指定してあげます。
これで、タイトル領域の表示はされなくなりますが、requestWindowFeature のタイミングに注意。
カスタムレイアウトをセットする前に呼び出さないと例外が発生します。
android.util.AndroidRuntimeException: requestFeature() must be called
【NGケース】
Dialog dialog = new Dialog(getActivity());
dialog.setContentView(R.layout.sample_layout);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); ← setContentViewの後に呼び出すと例外発生
【OKケース】
Dialog dialog = new Dialog(getActivity());
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setContentView(R.layout.sample_layout);
[Android][Volley] ImageRequestを使用していた箇所がDeprecatedになっていた
Androidアプリ用のネットワークライブラリとしてメジャーで使いやすいVolley。
相変わらず、お世話になっています。
URLの先の画像を取得する実装をImageRequestを使用していたのですが、警告出ているなと思ったらDeprecatedになっていた。
以下のように実装していました。
http://developer.android.com/intl/ja/training/volley/request.html
あれ、非推奨なのと思って回避策を調べていたら以下と同じだった。
http://stackoverflow.com/questions/33271864/android-volley-imagerequest-deprecated
なるほど、ImageRequestのクラスは非推奨ではなく、該当のコンストラクタが非推奨になっただけなので、コンストラクタをscaleTypeを追加したものに変更すればOKでした。
Volleyの中を見ると、ImageRequest内でScaleType.CENTER_INSIDEを指定してScaleType付きコンストラクタを呼び出しているので、前と同じ実装するのであれば、以下のように実装すればOK。
無事解決です!
相変わらず、お世話になっています。
URLの先の画像を取得する実装をImageRequestを使用していたのですが、警告出ているなと思ったらDeprecatedになっていた。
以下のように実装していました。
http://developer.android.com/intl/ja/training/volley/request.html
ImageRequest request = new ImageRequest(url,
new Response.Listener<Bitmap>() {
@Override
public void onResponse(Bitmap bitmap) {
mImageView.setImageBitmap(bitmap);
}
}, 0, 0, null,
new Response.ErrorListener() {
public void onErrorResponse(VolleyError error) {
mImageView.setImageResource(R.drawable.image_load_error);
}
});
あれ、非推奨なのと思って回避策を調べていたら以下と同じだった。
http://stackoverflow.com/questions/33271864/android-volley-imagerequest-deprecated
なるほど、ImageRequestのクラスは非推奨ではなく、該当のコンストラクタが非推奨になっただけなので、コンストラクタをscaleTypeを追加したものに変更すればOKでした。
Volleyの中を見ると、ImageRequest内でScaleType.CENTER_INSIDEを指定してScaleType付きコンストラクタを呼び出しているので、前と同じ実装するのであれば、以下のように実装すればOK。
ImageRequest request = new ImageRequest(url,
new Response.Listener<Bitmap>() {
@Override
public void onResponse(Bitmap bitmap) {
mImageView.setImageBitmap(bitmap);
}
}, 0, 0, ScaleType.CENTER_INSIDE, null,
new Response.ErrorListener() {
public void onErrorResponse(VolleyError error) {
mImageView.setImageResource(R.drawable.image_load_error);
}
});
無事解決です!
[Android][Volley]最新バージョンだとJsonArrayRequestがPOSTに対応していた
Androidアプリ用のネットワークライブラリとしてメジャーで使いやすいVolley。
Google製というのも多少安心感がある。
サーバとJSONでやりとりする場合は非常に便利で、使用していたんですが、 レスポンス結果がJSON形式の配列の場合に使用するJsonArrayRequestが少し不便でした。
コンストラクタが以下しかなくて、GETリクエストしか送れずPOSTでリクエストしたい場合、ちょっと面倒でした。。。
以下のように、同様に不便に感じている人も多かったと思います。
継承して、POSTメソッドでリクエストできるようにカスタマイズ対応が必要でした。
Volley - Sending a POST request using JSONArrayRequest
ところが、春ごろに本家のほうにGET/POSTが指定できるコンストラクタが追加されたみたいです。
https://android.googlesource.com/platform/frameworks/volley/+/master/src/main/java/com/android/volley/toolbox/JsonArrayRequest.java#54
これで、ようやくカスタマイズが必要なくなりました。
ライブラリのバージョンアップって、今まで動いてたものが動かなくならないか怖く中々踏み出しにくいが、やはり、こまめにアップデートは必要ですね。。。
Google製というのも多少安心感がある。
サーバとJSONでやりとりする場合は非常に便利で、使用していたんですが、 レスポンス結果がJSON形式の配列の場合に使用するJsonArrayRequestが少し不便でした。
コンストラクタが以下しかなくて、GETリクエストしか送れずPOSTでリクエストしたい場合、ちょっと面倒でした。。。
public JsonArrayRequest(String url, Listenerlistener, ErrorListener errorListener) {
super(Method.GET, url, null, listener, errorListener);
}
以下のように、同様に不便に感じている人も多かったと思います。
継承して、POSTメソッドでリクエストできるようにカスタマイズ対応が必要でした。
Volley - Sending a POST request using JSONArrayRequest
ところが、春ごろに本家のほうにGET/POSTが指定できるコンストラクタが追加されたみたいです。
https://android.googlesource.com/platform/frameworks/volley/+/master/src/main/java/com/android/volley/toolbox/JsonArrayRequest.java#54
@Override
protected ResponseparseNetworkResponse(NetworkResponse response) {
try {
String jsonString = new String(response.data,
HttpHeaderParser.parseCharset(response.headers, PROTOCOL_CHARSET));
return Response.success(new JSONArray(jsonString),
HttpHeaderParser.parseCacheHeaders(response));
} catch (UnsupportedEncodingException e) {
return Response.error(new ParseError(e));
} catch (JSONException je) {
return Response.error(new ParseError(je));
}
}
これで、ようやくカスタマイズが必要なくなりました。
ライブラリのバージョンアップって、今まで動いてたものが動かなくならないか怖く中々踏み出しにくいが、やはり、こまめにアップデートは必要ですね。。。