Google Plugin for Eclipse 4.3のネットワークインストールでエラー
Google Plugin for Eclipse 4.3をEclipse Market Place経由でインストールしようとしたらアーティファクトが見つかりません的なエラーが発生しインストール不能に。
Windows 7のCドライブ直下にeclipseを置いていたため、UACがらみの問題かと思ったが、ユーザディレクトリに移動させても状況は変わらず。
しかたがないのでいったんローカルにファイル一式を落としてくる方法でやったら無事にインストール完了!
ローカルインストール手順サイト
https://developers.google.com/eclipse/docs/install-from-zip
まだ家では試していないが、上記で出来たということは会社のFirewallが原因かもしれない。
APKの署名を確認する方法
このAPKってどの署名をつけたっけ?ってときに確認する手段です。
jarsigner -verify -verbose -certs my_application.apk
参考URL
http://www.taosoftware.co.jp/blog/2008/11/android_2_1.html
OutOfMemoryErrorを救う方法
とある開発中のアプリを解像度縦横それぞれ1.5倍の端末にそのまま突っ込んでみたら、OutOfMemoryErrorが出ました。
解像度的には増えているのでcreateBitmapしてる部分が単純に2.25倍になるわけなので、最初しょうがないかなとも思いましたが、以前動かしていた端末でもギリギリではなかったし、さらにメモリも潤沢にあるはずのNew端末で、一部でしか使っていないBitmapの使用料が2倍程度増えたからって、それはないだろう?と思い、調べてみました。
で、原因はまだわかりませんが、以前の端末よりアプリが使用出来るNative Heapが少ない様子。
ネイティブヒープ量は
Debug.getNativeHeapAllocatedSize()
でわかるようです。
どうにかならないかと思って調べていたら、このサイトを発見!
http://d.hatena.ne.jp/baroqueworksdev/20110513/1305313028
API LEVEL 11からAndroidManifest.xmlに以下を指定可能に。
android:largeHeap="true"
これでとりあえずは解決できました。
が、そもそもメモリ使い過ぎなのかもしれませんし、安易にコレを使っていいものかどうか…わかりません。他に悪影響なければいいんですけど。
参考URL
http://d.hatena.ne.jp/baroqueworksdev/20110513/1305313028
http://www.kaede-software.com/2012/04/_outofmemoryerr.html
http://www.saturn.dti.ne.jp/npaka/android/memory/index.html
APK内のAndroidManifest.xmlを取り出す方法
アプリのメモリ状況をチェックするコマンド
adb shell dumpsys meminfo パッケージ名
このように表示されます。
これを、例えばアプリの画面が切り替わる前後でそれぞれ取得すると、そのメモリ使用量の差分がわかったりするので、大量にメモリを消費しているシーケンスをある程度特定できたりします。
ちょっとだけ説明 Native → ネイティブヒープ情報。Bitmapを使用したり、ネイティブライブラリ内でmallocしたりすると消費されます。 Dalvik → Javaヒープ情報。Javaでnewしたオブジェクトや配列、String定数などが含まれます。MEMINFO in pid 370 [パッケージ名] **
Shared Private Heap Heap Heap Pss Dirty Dirty Size Alloc Free ------ ------ ------ ------ ------ ------ Native 6328 1024 6300 11948 9113 1666 Dalvik 47438 14076 47080 64647 55201 9446 Cursor 0 0 0 Ashmem 2 4 0 Other dev 7469 476 656 .so mmap 900 1904 696 .jar mmap 0 0 0 .apk mmap 0 0 0 .ttf mmap 99 0 0 .dex mmap 164 0 8 Other mmap 207 8 28 Unknown 1646 280 1640 TOTAL 64253 17772 56408 76595 64314 11112 Objects Views: 1647 ViewRootImpl: 4 AppContexts: 4 Activities: 1 Assets: 2 AssetManagers: 2 Local Binders: 17 Proxy Binders: 24 Death Recipients: 3 OpenSSL Sockets: 0 SQL heap: 0 MEMORY_USED: 0 PAGECACHE_OVERFLOW: 0 MALLOC_SIZE: 46 Asset Allocations zip:データのパス/XXXXX.apk:/resources.arsc: 492 K
ListViewを複数選択と単選択で切り替える方法
通常は単選択(Single)モードで、ユーザのメニュー選択により複数選択(Multiple)モードに切り替わるようなListViewを作成する。
まず使えそうだったのが、
API LEVEL 11から追加されたListView.CHOICE_MODE_MULTIPLE_MODALでsetChoiceModeを使って設定する。
listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
参照URLはココ。
http://techbooster.org/android/ui/3503/
しかし、setMultiChoiceModeListener()を使って専用のリスナをセットしなければならない等、ちょっと面倒。私のやりたいことは2つ目のItemを選択したら、その2つのItemのデータを取り出して、次の画面に遷移できればいいので、そこまで本格的なことはやらないし、API LEVEL7との互換性も保ちたいしということで、普通にAPI LEVEL1から存在するListView.CHOICE_MODE_MULTIPLEを使うことにした。
まずListViewのChoiceModeをCHOICE_MODE_MULTIPLEにする。
listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
次に、これまではListViewのItemにはTextViewを使用していたが、CheckedTextViewに変更することにした。
しかし、これではいつもチェックボックス付きのListViewになってしまうので、チェックボックスを表示・非表示できるようにする。
私のアプリでは、ListAdapterをカスタマイズして使用しているので、overrideしているgetView()を以下のようにする。
class ListAdapterImpl extends BaseAdapter implements ListAdapter { @Override public View getView(int position, View convertView, ViewGroup parent) { if(convertView == null) { convertView = getLayoutInflater().inflate(R.layout.rowdata, parent, false); } TextView tv = (TextView)convertView.findViewById(R.id.TextView); tv.setText(mData.getList().get(position)[0]); if(mIsMultiple){ int[] attrs = { android.R.attr.listChoiceIndicatorMultiple }; TypedArray ta = convertView.getContext().getTheme().obtainStyledAttributes(attrs); Drawable indicator = ta.getDrawable(0); ((CheckedTextView)tv).setCheckMarkDrawable(indicator); ta.recycle(); } else { ((CheckedTextView)tv).setCheckMarkDrawable(null); } return tv; } }
rowdata.xmlはこんな感じ。
あとは、mIsMultipleをT/F切り替えればいいわけだが、getView()を任意で呼び出すのに以下のメソッドを使用したが、ダメだった。
adapter.notifyDataSetChanged();
こいつはDataSetを再設定してはくれるが、表示は変えてくれないらしい。
ちなみにBaseAdapterには
adapter.notifyDataSetInvalidated();
というのもあるが、notifyDataSetChanged()との違いがよくわからない。
結局、表示をし直すために、以下のようにした。
ListView.setAdapter(new ListAdapterImpl())
Adapterを作りなおして、setAdapterをし直す。
他にも手段はあるのかもしれないが、とりあえずこれでOK。
あとはListView.onItemClick()でもsingle用の処理とmultiple用の処理を書分ければ完了!
多分今回は複数選択といっても2個という制限付きだったからこれが楽だったけど、本当に0〜nという条件だったら素直にCHOICE_MODE_MULTIPLE_MODALを使うのが楽そう。
参照URL
http://d.hatena.ne.jp/satosystems/20120315/1331818858
http://techbooster.org/android/application/6550/
http://techbooster.org/android/ui/3503/
http://techbooster.org/android/ui/13946/