カテゴリー: Android

"appcompat_v7"フォルダの自動作成ってバグなの?仕様なの(´・ω・`)?

追記20150115
久しくAndroidプロジェクトを新規作成していなかったので気付かなかったけど
最新版だと"appcompat_v7"プロジェクトが自動増殖せずに同じものを参照する
ようなのでこの手順は不要の筈。


ここでのやり取りを見ると仕様のようだな… (ヽ'ω`)
https://code.google.com/p/android/issues/detail?id=66975

The templates are frequently updated, so in the future we may create a template version that does not use AppCompat at all.

とか言ってるし。

他の事をやっていて気が付かなかったが、このアップデートでサポートライブラリの
インポートやActionBarActivityをデフォルトで使用するようになってたんだな。

v7絡みではもう意味はなくなったが、手順の説明としては何らかの意味はあるので
公開しとく (ヽ'ω`)
サポートライブラリのダウンロード
リソースを含むサポートライブラリの追加


appcompat_v7絡みでぐぐっていてヒットしたエントリで増え続けるライブラリプロジェクトへの
対処として、その参照を変更して増えたプロジェクトを削除する案があった。
日々雑感、覚書: Androidアプリ開発:ADT eclipseの更新-appcompat_v7プロジェクトが勝手に作られる!?

一応その手順のスナップショットは取ったが、果たしてこれでいいのか(運用的にw)
よくわからないのでこちらでのみ適当に載っけておこうw
これはインポートしたサポートライブラリへ変更しているけれども、
"appcompat_v7"でも問題はない模様。

  1. 該当のプロジェクトを右クリック。
    appcompat_v7-001
  2. 表示されたコンテキストメニューから[プロパティー]をクリック。appcompat_v7-002
  3. 参照しているライブラリを選択して<除去>をクリックappcompat_v7-003
  4. <追加>をクリック。appcompat_v7-004
  5. 任意のライブラリプロジェクトを選択して<OK>をクリック。appcompat_v7-005
  6. <OK>をクリック。appcompat_v7-006
  7. 不要になったプロジェクトを削除。appcompat_v7-007
  8. チェックを入れて<OK>をクリック。appcompat_v7-008

一応これで大丈夫そうだけども、どうなんだろうか(・∀・)?


一回ダウングレードに成功したんだけれども、その後は何度やってもうまくいかない(´・ω・`)
Eclipse4.2のPluginのuninstallではまったのでメモ
書いてあったようにプラグインをeclipse上でアンインストールし、プラグインを削除し、artifacts.xmlから該当部分を全部削除してfeatureの方も削除したのに、
アーカイブで22.3を入れようとすると"Android 開発ツール"だけが
「最新版がインストールされているので無視されます」みたいな表示が出る…(ヽ'ω`)

まあこれはもういいかw


アクションバーとの奮闘で一ヶ月を浪費してしまった気がしないでもない…(ヽ'ω`)
ちょうどアップデートとぶつかったのが混乱が長期化した原因であった…_| ̄|○

あれ…コンソールでxmlのリソースエラーって表示されてたのか…今まで気付かなかった…_| ̄|○

appcompat_v7] WARNING: unable to write jarlist cache file

android-support-v7-appcompat] Unable to resolve target ‘android-16′の問題を
解決したと思ったら、"appcompat_v7] WARNING: unable to write jarlist cache file"という
警告が新たに発生した(´・ω・`)
android-7

ぐぐったら、

Thats because you need ALSO Adriod Version 2.1! Go to Andriod SDK Manager and download Andriod Version 2.1 (API 7)

appcompat - Unable to write jarlist cache file while creating android project

ということだったので、SDKマネージャーでダウンロードした。
そうしてからeclipseを再起動したら警告が消えた。


でもAndroidプロジェクトを新規作成すると自動的に"appcompat_v7"で始まる
謎のプロジェクトが増殖し続けるエラーの回避方法がわからない(´・ω・`) チョウサチュウ

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


サポートライブラリの使い方を書いていて遭遇したエラー。

  • Android SDKを新規にインストール
  • SDKマネージャで初回起動時にチェックが入ってるパッケージのみをダウンロード
    (デフォルトでサポートライブラリにチェックが入っていた)
  • eclipse(Pleiades All in one)を新規インストール
  • Googleプラグインをインストール

そしてGoogleプラグインインストール後の再起動でタイトルのエラーが表示された。
android-16

ぐぐったら、解決法らしきものがあった。
eclipse - Adding Support Libraries to Android project - Stack Overflow

  • android-support-v7-appcompatのライブラリプロジェクトを一旦削除してから、
    インポートし直す。
  • android:targetSdkVersionを18等に変える。
  • SDKマネージャでAPI 16のパッケージをダウンロードする。

特に深く考えずAPI 16のパッケージを入れた。
api-16

それでエラーが消えたが原因は謎のまま(´・ω・`)

Android Unable to resolve target ‘android-16′ After appcompat-v7 install
この人はAPI 17の段階でこのエラーに遭遇していることを踏まえると
API 16とAPI 17の間に何かあるということかな。

Android4.1(APIレベル16)からはJellyBeanだから、
APIレベル17がAPI16の何かを参照してるのかな?

まあいいか(・∀・)

android:actionBarStyle requires API level 11 (current min is 8)


「アクションバーのスタイル設定」の内容を試して遭遇したエラー(´・ω・`)

サポートライブラリを使用して、android:minSdkVersionが11より低い場合に発生。
eclipseの設定が違うのか、何処か他のページで回避法が記載されているのか
わからないが、少なからず「アクションバーのスタイル設定」では原因も回避法も
わからず(´・ω・`)

"android:actionBarStyle"でぐぐる。幾つかヒットしたページを眺めるうちに
回避法らしきものを発見ヽ( ・∀・)ノ
Android アプリ開発で使える XML の Tools 属性

tools:targetApi
Java における @TargetApi アノテーションと似たもの。 指定の要素がどの API level 以上で解釈可能なものなのかを、API level のコードネームか整数で指定することができる。
これも lint による検査時に使用される。
例えば android:actionBarStyle を API Level 11 より古い Android も対象にしているアプリで使うと 『android:actionBarStyle requires API Level 11 (current min is 7)』 ってエラーが lint で出されるけど、そういう場合にこの属性を使えば良い。

これだ(`・ω・´)と思い、あんまりよく読まず属性を付与してみるも、変化なし。
あるぇ(・3・)?と思いつつ、更にリンクされていたTools Attributesというページを開く。

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >
....

あ(ノ∀`)
名前空間のなんたらこうたらの「xmlns:tools="http://schemas.android.com/tools"」を
指定し忘れていたw

多分、こういう形になればエラーが消えるはず。

<resources>
    <!-- the theme applied to the application or activity -->
    <style name="CustomActionBarTheme"
           parent="@style/Theme.AppCompat.Light.DarkActionBar"
           xmlns:tools="http://schemas.android.com/tools">
        <item name="android:actionBarStyle" tools:targetApi="11">@style/MyActionBar</item>
 
        <!-- Support library compatibility -->
        <item name="actionBarStyle">@style/MyActionBar</item>
    </style>
 
    <!-- ActionBar styles -->
    <style name="MyActionBar"
           parent="@style/Widget.AppCompat.Light.ActionBar.Solid.Inverse">
        <item name="android:background">@drawable/actionbar_background</item>
 
        <!-- Support library compatibility -->
        <item name="background">@drawable/actionbar_background</item>
    </style>
</resources>

名前空間の宣言は<style>じゃなくて<resources>の方が良いのかな?
このパターンだと関係してくるのは一つ目の<style>のところだからこれでもいいけど。

そいでactionbar_background.pngという名前の
actionbar_background
みたいなのをres/drawable-ldpiの辺りにぶち込んで実行すれば動くはず。

一応解決したので詳しく読まなかったが、バージョン別のフォルダにそれぞれの
バージョン向けのtheme.xmlを置いても回避出来るという話?
android:actionBarStyle requires API level 11
よくよく読んでみると、このページにも上記の回避法も書いてあるか。

Issue with changing ActionBar background - Android
画像を用意したくなかったら、ハードコーディングは良くないけど、
色指定する方法もあるよとのアドバイスもあったが試してないw


テキストカラーのカスタマイズの方も似たような修正を加えて、

<resources xmlns:tools="http://schemas.android.com/tools">
    <!-- the theme applied to the application or activity -->
    <style name="CustomActionBarTheme"
           parent="@style/Theme.AppCompat"
           xmlns:tools="http://schemas.android.com/tools">
        <item name="android:actionBarStyle" tools:targetApi="11">@style/MyActionBar</item>
        <item name="android:actionBarTabTextStyle" tools:targetApi="11">@style/MyActionBarTabText</item>
        <item name="android:actionMenuTextColor" tools:targetApi="11">@color/actionbar_text</item>
 
        <!-- Support library compatibility -->
        <item name="actionBarStyle">@style/MyActionBar</item>
        <item name="actionBarTabTextStyle">@style/MyActionBarTabText</item>
        <item name="actionMenuTextColor">@color/actionbar_text</item>
    </style>
 
    <!-- ActionBar styles -->
    <style name="MyActionBar"
           parent="@style/Widget.AppCompat.ActionBar">
        <item name="android:titleTextStyle" tools:targetApi="11">@style/MyActionBarTitleText</item>
 
        <!-- Support library compatibility -->
        <item name="titleTextStyle">@style/MyActionBarTitleText</item>
    </style>
    <!-- ActionBar title text -->
    <style name="MyActionBarTitleText"
           parent="@style/TextAppearance.AppCompat.Widget.ActionBar.Title">
        <item name="android:textColor">@color/actionbar_text</item>
        <!-- The textColor property is backward compatible with the Support Library -->
    </style>
 
    <!-- ActionBar tabs text -->
    <style name="MyActionBarTabText"
           parent="@style/Widget.AppCompat.ActionBar.TabText">
        <item name="android:textColor">@color/actionbar_text</item>
        <!-- The textColor property is backward compatible with the Support Library -->
    </style>
  </resources>

res/values/の下にcolor.xmlを作成して

<resources>
    <color name="actionbar_text">#FF0000</color>
</resources>

のような感じにすると
a01
みたいな結果になるはず。("a01"はアプリ名なのでその部分は異なる)

「タブインディケイターのカスタマイズ」はまだやってない(ノ∀`)


前々から気になっていたのだが、ごっぐるのトレーニング内容って誰向けというか
どのくらいの知識を持つ人間に対して書かれているんだろうか?
初心者だったら、このtools:targetApiや他の回避方法ってわからないような気が
するんだけど、俺氏以外の人は皆優秀な初心者達なんだろうか(´・ω・`)