カテゴリー: 覚書

覚え書き 主にレイアウトの背景色

レイアウトとシークバーを色々といじっていて時間を浪費中…(ヽ’ω`)
まあ少しずつ問題は解決というかやりたいことは出来ていってはいるが、
これ本当に必要な機能なんだろうかと思ったり、思わなかったり。


レイアウトの背景色の取得
android – Get background color of a Layout – Stack Overflow

レイアウトの背景色のセットとColor.parseColor(“#nnnnnn”)
background – How to change color of drawable shapes in android – Stack Overflow

いつも忘れるHex文字列化(´・ω・`)
String hexColor = String.format(“#%06X”, (0xFFFFFF & intColor));
java – How to convert a color integer to a hex String in Android? – Stack Overflow


垂直シークバー
Working Vertical SeekBar for Android

API11以降ではandroid:rotationを使えばいいらしいが、少し変わったことをやっている
所為かいまいち上手く行かずに結局カスタムseekbarを利用することに。コード内容は
判ったような、判らないような…(ノ∀`)


Preferenceの根本的なレイアウト等をいじる
Android – 標準の設定画面をカスタマイズしたい その1
platform_frameworks_base/core/res/res/layout at master · android/platform_frameworks_base

設定値? まあ直で指定してもいいんだけど、一応
framework-res dimens.xml


あともうちょいで本当にコントローラ絡みが終わ…

( ゚Д゚)ハッ まだノーティフィケーションの方もそろそろ修正しなきゃ駄目か…(ヽ’ω`)

覚え書き 主にPreference絡み

PreferenceActivityというかPreferenceFragmentについては終わりと思い先に進もうと
思っていたが、ふとSeekBarを用いるPreferenceが欲しいなと思いぐぐる。
いっぱいヒットする(・∀・) ドレガエエンジャロウカ…

適当にAndroid 設定画面を簡単に作成する (ANDROID HACKS)のエントリのコードを
試してみる。上手く行った。これの中身を読んでベースにする方向でヽ( ・∀・)ノ

そう言えばpreference_widget_seekbar.xml内のSeekBar要素内で
xmlns:android=”http://schemas.android.com/apk/res/android”が指定されていて
eclipseだとエラーになった。これは一回だけ指定すればいいらしい属性みたいだが、
その辺のことはよくわからないので取り敢えず削ったらエラーが消えた。
問題がなさそうなので気にしないでおくか( ・´ω・`) イイノカ、ソレデ?

Preferenceの内部の動きを余り理解出来ていないと思い、Preferenceのカスタマイズに
ついて更にぐぐる。


三択プリファレンスがあった。コントローラのポジションはわざわざダイアログを出す
よりもこういった形で変更出来るようにしておいた方がいいのかな?
Preference(4)-Preferenceのカスタマイズ

三択プリファレンスは試したが、ダイアログの方は試していない。
うちがWindowsだからなのかSyntaxHighlighterのコピーを使うと
 が中に混ざってちょっとめどかった(´・ω・`)
もしかしてうちのコードも他所の人がコピペしたらこうなってるのかな?

あとコード的には一致してるので問題はないが、なせcustom_prefernce.xmlなんだヽ(`Д´)ノと
eが抜けているのが気になったw すごくどうでもいいw


ダイアログの方はフルコードで載っているDialogPreferenceをカスタマイズするの方を試した。
パッケージ名を適当につけたのに、setting.xmlファイル内でのフルパス指定を
修正しなくてちょっとハマったのは内緒(*´・ω・)

[Android] オリジナルのPreferenceを作ってみるのサンプルはプリファレンスアクティビティの
表示は変更されたけど、ダイアログは普通の物と同じだったような。
Androidのバージョンの違いかなんかか、何か間違えてるのかな(ノ∀`)
内容を読んでみたがよくわからないので、取り敢えず必要になった時に
また読んでみよう。


Androidの設定画面で使うカスタムPreferenceを作るのサンプルは
名前空間名は適当(hoge)でいいみたいだけど、

xmlns:hoge="http://schemas.android.com/apk/res/hoge"

って

xmlns:hoge="http://schemas.android.com/apk/res/info.loadlimits.android.preference"

じゃないと動かないのではなかろうか。というかうちの環境では動かなかった。
ここもパッケージ名をきちんと指定しないと駄目なのか。


そう言えば、他のサンプルはattrs.xmlなのにこのサンプルはattr.xmlだなぁ、
なんで問題なく動くんだろ、違いはなんだろと思いぐぐった。特にそれに関する
記述は見つからない。ソース等を見てもattr(s).xmlを指定している部分はない。
xmlファイルを開き<resources>を眺めていて

( ゚Д゚)ピコーンッ! と閃く。

ファイル名をa.xmlにして実行してみる。動く。理解した(`・ω・´)

valuesフォルダのファイルって人間が理解しやすいように分けているだけであって、
実際はシステムが全xmlファイル内にある<resources>要素以下を調べて
<string>や<dimen>等のリソースを収集して一括管理してるんだなw

試しにdimens.xmlにattr.xmlやstrings.xmlの内容を移植してもちゃんと動いた。

xmlもxmlフォルダを掘らずにlayoutフォルダに入れてR.layout.~で指定しても
いいみたいだから、結構自由なんだな。まあお作法に従って作るべきなんだろうけど。

どうでもいいことだけど、謎が解けて面白かったw


サンプルは有難いが、基本的に判る人向けのためか断片的なコードまたは
ファイルのみということが多いので初心者である俺氏は試すのに苦労した(ヽ’ω`)

新規のAndroidプロジェクトをデフォルトで作成して(最小必須SDKだけ4.0.3にした)、
その他のファイル等を作成したりコピーして、MainActivityに

import android.os.Bundle;
import android.preference.PreferenceActivity;
import android.preference.PreferenceScreen;

public class MainActivity extends PreferenceActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
		PreferenceScreen pScreen = getPreferenceManager()
				.createPreferenceScreen(this);
		pScreen.setTitle("Custom Preference");
		setPreferenceScreen(pScreen);

		addPreferencesFromResource(R.xml.[プリファレンス用のxml]);
    }
}

を貼っつけて、プリファレンス用のxml(通常xmlフォルダ以下に作ったxmlファイル)を
指定すれば簡単に試せる…と思う。 多分。

途中までわざわざPreferenceActivityを作って試していたのでめどかった(´・ω・`)


全然関係ないけど、なんでeclipseはアクティビティを新規作成した時に
マニフェストに自動追加してくれないんだろうか?マニフェストに記載しないと
アクティビティはシステムから認識されないのだから、アクティビティを作成した
段階で自動追加されるか、追加されていないことに対してのエラーが表示される
べきなのではなかろうかと思ったり。

ついでに新規Androidプロジェクトの作成ダイアログにxmlフォルダやdrawableフォルダ、
attrs.xml,colors.xml等の作成チェックボックスとかもついていれば更に良いのに。


サンプルコードを書いてる人達は何気なくTypedArrayを使ってるけど、TypedArrayって
なんだべ(´・ω・`)?

TypedArray
obtainStyledAttributes(AttributeSet, int[], int, int)またはobtainAttributes(AttributeSet, int[])を用いて取得される値の配列用のコンテナ。それらが完了した時には必ずrecycle()を呼んで下さい。この機構から値を取得する為に使用されるインデックス群はobtainStyledAttributesへ指定される属性の位置に対応しています。

TypedArray

へぇ…(´・ω・`)

で、サンプルによってはrecycle()を呼んでるんだけども、
なんでrecycle()を呼ばないといけないのかなと思ってぐぐる。

android – what is the use of recycle() method in TypedArrayでVinayさんは、

それはC言語のポインタのクリアの考えに似てるよ。それが必要ない時にメモリ/データが”a”に非効率的にバインドされないように”a”に関連付けられたデータがガベージコレクションされるようにするために使われるよ。ここを読んで見て(Bitmap#recycle()へのリンク)。あなたが実際に”a”を再利用しないなら、これは実際には必要がないということに注意することが重要だよ。GCはそのオブジェクトが再び使用されないのなら、あなたの為にこのデータを自動的にクリーンアップするはずだよ。しかしながらTypedArrayが異なる理由は以降での使用の為にTypedArrayへ戻さなければならない他の内部データ(StyledAttributes)をTypedArrayを持っているからです。

みたいなことを言っているけどなんかよくわからないw
関係ないけどVinayさんはアフロだね(・∀・)

Bitmap#recycle()では明示的にGCが可能であるとマークするみたいなことを書いてあり、
TypedArray#recycle()は

以降の呼び出し元によって再利用されるためにTypedArrayをリサイクルします。この機能の呼び出しの後、あなたは再びこの型付けされた配列に触れてはいけません。

という感じなので、明示的な破棄の指示をしてるのかどうかよくわからない。
他の人とのやり取りで

TypedArrayに関連付けられたメモリは以降の呼び出し元によって再利用されることが出来るよ、あなたのプログラムのインスタンスじゃなくてね。

みたいなことを言っているのでメモリのアロケーションを保持するってこと(´・ω・`)?
なんか違う?

StyledAttributesを持ってるとあるけどTypedArrayにstaticメンバは居ないような。
staticメソッド TypedArray.obtain()で

final TypedArray attrs = res.mTypedArrayPool.acquire();

して
TypedArray.recycle()で

mResources.mTypedArrayPool.release(this);

してるけど、これのこと?

userSeven7sさんの回答では

recycle()はアロケートされたメモリが直接利用可能なプールへ返されるようにし、ガベージコレクションまで留まりません。このメソッドはまたBitmapでも利用可能です。

とあった。

なんかようわからんヽ( ´・ω・)ノ


他にもサンプルはあったがもう疲れたのでいいや…_| ̄|○

まあ結局のところ、カスタムプリファレンスの作成手順は

  1. 必要ならばattrs.xmlを作って属性を作る
  2. カスタムプリファレンス用のレイアウトを作る
  3. カスタムプリファレンス用のクラスを作る(Preferenceクラスまたはそのサブクラスを拡張)

ということか。

なんかまた横道に逸れて時間を浪費したような気がする…(ヽ’ω`)

覚え書き

java.lang.RuntimeException: Content has view with id attribute 
'android.R.id.list' that is not a ListView class

のエラーが出た時にぐぐったようだが、どれが答えか忘れた(ノ∀`)

xml – “Content has view with id attribute ‘android.r.id.list’ that is not a ListView Class.” when create a list view in a fragment – Stack Overflow
FATAL EXCEPTION: main java.lang.RuntimeException: Content has view with id attribute ‘android.R.id.list’ that is not a ListView class – Stack Overflow
Your content must have a ListView whose id attribute is ‘android.R.id.list’ – Stack Overflow
java.lang.RuntimeException: Your content must have a ListView whose id attribute is ‘android.R.id.list’ – Stack Overflow


Caused by: java.lang.ClassNotFoundException: 
Didn't find class "com.xxxxx.yyyyy.MainActivity" on path:
 DexPathList[[zip file "/data/app/com.xxxxx.yyyyy-1.apk"],
nativeLibraryDirectories=[/data/app-lib/com.xxxxx.yyyyy-1,
 /vendor/lib, /system/lib]]

何のエラーだか覚えてなかったけど、サポートライブラリのコンフリクト絡みみたい。
java – Android ClassNotFoundException: Didn’t find class on path – Stack Overflow


マニフェストファイルから記載されているアクティビティを取得してインテントで
起動する際に読んだ…はず。

StringからActivityを開始する
java – How can I start a new android activity using a string? – Stack Overflow

contextからactivityのクラス名を取得する – Screaming Loud


あんまり詳しく覚えていないが、何の考えもなしにSDK等を最新版にしたら
eclipseがおかしくなった。

android:actionModeShareDrawable No resource found 
that matches the given name

やら

android-support-v7-appcompat] Unable to resolve target 'android-21'

というエラー(警告?)を消そうと思って、
SDK更新後にAndroid のビルドエラー(No resource found that matches the given name)AICS
gradle – appcompat-v7:21.0.0′: No resource found that matches the given name: attr ‘android:actionModeShareDrawable’ – Stack Overflow
のことを試したり、

@integer/google_play_services_version

のエラーを消そうと
y.okano blog: Eclipse で google_play_services_version が見つからない
を試したり、その他諸々のことを適当にいじくっていたら、
eclipseがおかしくなった…(ヽ’ω`)

長時間奮闘したが復旧せず、新しいeclipse環境を構築し直す…_| ̄|○
途中、AndroidStudioに乗り換えようと思ったが、いまいち慣れないのと
うちのマシンの性能が低すぎて、取り敢えずインストールしてサンプルを
実行しただけ…__◯_ まあいずれ使ってみよう…何にしても時間を無駄にした…

覚え書き

E/ActivityThread(2733):
Activity com.example.musicplayer.MusicPlayerActivity 
has leaked ServiceConnection 
com.example.musicplayer.MusicPlayerActivity$1@44ac5bd8 
that was originally bound here

色々なパターンで出るらしいが今回の場合はunBindしてないサービスを再びbindしようと
していたのが原因みたい。あとonDestroyでunBindしていない場合にも発生した。


QCMediaPlayer mediaplayer NOT present

android – Why MediaPlayer throws NOT present error when creating instance of it? – Stack Overflow

It means your platform does not support QCMediaPlayer. 
QCMediaPlayer provides extended APIs and interfaces to get 
and set MPD attributes for DASH protocol in compatible 
Snapdragon builds. So, this error should not affect on 
media playing in normal case

”あなたのプラットフォームがQCMediaPlayerをサポートしていないことを意味します。QCMediaPlayerはSnapdragon互換ビルド?でDASHプロトコル用のMPD属性を取得や設定する為の拡張されたAPIやインターフェースを提供します。従って、このエラーは通常の場合メディア再生に影響しないはずです。”

みたいな感じなので、無視していいみたい。SOL25がsnapdragon搭載だから出てるのかな?



MediaPlayer Should have subtitle controller already set

Should have subtitle controller already set というエラー – Google グループ
Should have subtitle controller already set Mediaplayer error Android – Stack Overflow
Android MediaPlayer warning: Should have subtitle controller already set – Stack Overflow

kitkat(4.4)以降で出るようになった模様。subtitle controllerが動画の字幕関連の
ものらしく、音楽再生には関係ないらしい。二番目のページで空のSubtitleControllerを
作ってMediaPlayerにセットするという回避法らしきものがあったけれども、面倒なので
試していない(ノ∀`) 歌詞ファイルでも読み込んで適切な時に歌詞をくれるなら意味が
ありそうだが、そんな機能はあるんだろうか?


MediaPlayer.create() と setAudioStreamType() は相性が悪い

何を調べてる時にヒットしたのか忘れたが、こういうこともあるのか。


stop called in state 1

元にしたチュートリアルのServiceのonUnbind()と同じ

mp.stop();
mp.release();

にしていたが、終了方法が違う場合にエラーが出た。

idleかなんかの状態でstop()を呼んでるのがいけなかったらしい。
stop()をreset()にしたら、エラーは出なくなったがこれでいいんだろうか?
そもそもrelease()が呼び出せる状態がanyだからreset()する必要はあるのか?
謎だ。


ViewPagerでの無限ループ移動が出来るかどうかぐぐった。
→ あるにはあったが、なんだかようわからんのでパス(´・ω・`)
→ ViewPagerにListFragmentを載せる方法がわからなくて四苦八苦
→ 色々ドキュメントを読んでようやくわかる∩(・ω・)∩
→ 画面回転時にアクティビティが再作成されてService内で色々とエラー地獄
→ MediaPlayerをunBindせずreleaseもせずやろうとするも違うエラー地獄
→ android:configChanges=”orientation|screenSize”を指定して自分で
レイアウトをいじる方法を探すかと思う(´・ω・`)
→ 指定したらエラーが消えて何故か画面回転してもきちん横長なレイアウト?になる
→ フシギ(・∀・) ←イマココ

なんで大丈夫なんだろうか。大元がmatch_parentなViewPagerだけで中身が
setRetainInstance(true)してるFragmentだからレイアウトが関係ないと
いうことなんだろうか。基礎知識がないのでよくわからないw

今回の件でようやくAndroidの基礎的な部分を調べ始めた(ノ∀`)


仕事探さなきゃといいながらこんなことやったり、Androidの基礎編とか
訳し始めながら、ソリティ馬やったり、ねこあつめでまんぞくさんの為に
高級カリカリを用意したりする日々。これではいけませんね…( ´・ω・)