GoogleサンプルでAndroidアプリを学ぶ(ActionBarCompat-ShareActionProvider)
しばらくぶりにAndroidの勉強をしようと思い、Googleのサンプルから始めることにしました。
勉強の仕方としては、サンプルを参考に、1からプロジェクトを作ってサンプルを移植していきます。
いつまで続くかわかりませんが。。
[開発環境]
Android Studio
[使用したサンプル]
ActionBarCompat-ShareActionProvider
[機能]
・ページを切り替えるとテキストとassetsに格納された画像の表示を切り替える。
・表示されているコンテンツを他のアプリとShareする。
学んだことを記載します。
Assets
Assetsフォルダの追加
このサンプルではassetsフォルダにある画像を表示しておりますが、Android Studioにはassetsフォルダ自身が作成されてません。なので以下の手順でassetsフォルダを作成しました。
Step1. 表示を「Android」から「Project」へ変更
Step2. app\mainで右クリックし、「New」→「Directory」でassetsを作成
Step3. ファイルブラウザで作成したassetsフォルダに画像をコピー
Assetsフォルダのファイルへのアクセス
少しハマったので記載しておきます。
このサンプルはコンテンツを他のアプリとのShareすることを目的としているため、以下のようにContentProviderを拡張したクラス を作ってます。
public class AssetProvider extends ContentProvider
本来ならば以下のようにAssetManagerを使えば取得できるらしいのだが、できなかった。
AssetManager am = getContext().getAssets();
調べてみるとContentProviderを拡張したクラス を使っているため、AndroidManifest.xmlに
providerを追加する必要があった。
<application
<activity
</activity >
<provider
android:authorities ="com.example.android.actionbarcompat_shareactionprovider"
android:name =".content.AssetProvider" />
</application >
他のアプリとのShare(Intent)
のアイコンを出すために以下が必要。
Step1. menu_main.xmlに以下を追加する。
<menu
xmlns:support ="http://schemas.android.com/apk/res-auto" >
<item
android:id ="@+id/menu_share"
android:title ="@string/menu_share"
support:actionProviderClass ="android.support.v7.widget.ShareActionProvider"
support:showAsAction ="always" />
</menu >
Step2. onCreateOptionsMenuの修正
ShareActionProviderはv7.widegetのほうをimportする必要があるので注意が必要。
イメージとしては以下のような感じな気がする。
import android.support.v7.widget.ShareActionProvider;
private ShareActionProvider mShareActionProvider;
@Override
public boolean onCreateOptionsMenu (Menu menu) {
getMenuInflater().inflate(R.menu.menu_main, menu);
MenuItem shareItem = menu.findItem(R.id.menu_share);
mShareActionProvider = (ShareActionProvider) MenuItemCompat.getActionProvider(shareItem);
int currentViewpagerItem = ((ViewPager)findViewById(R.id.viewpager)).getCurrentItem();
setShareIntent(currentViewpagerItem);
return super .onCreateOptionsMenu(menu);
}
private void setShareIntent (int position) {
if (mShareActionProvider != null ) {
ContentItem item = mItems.get(position);
Intent shareIntent = item.getShareIntent(MainActivity.this );
mShareActionProvider.setShareIntent(shareIntent);
}
}
[ContentItem.java]
public Intent getShareIntent (Context context) {
Intent intent = new Intent(Intent.ACTION_SEND);
switch (contentType) {
case CONTENT_TYPE_IMAGE:
intent.setType("image/jpg" );
intent.putExtra(Intent.EXTRA_STREAM,getContentUri());
break ;
}
return intent;
}
ViewPagerに表示するための仕組みがよくわからなかったので、簡単な図にしてみました。
ViewPagerで表示する中身を生成するためのAdapter(PagerAdapter)を使ってます。
暗黙的Intent
今回使用したのは暗黙的Intentであり、他のアプリと連携するために使用する。
宛先となるオブジェクトを明示的に指定せずに所定の動作、データのみを指定する。
これによりAndroidシステムが該当するオブジェクトをシステム全体から検索し、起動するしくみ。
それと対象に明示的Intentは画面遷移などアクティビティーから他の指定したアクティビティーへ送るIntent。
今回の場合は以下。
・Intentのコンストラクタでアクション(Intent.ACTION_SEND)を
指定してインスタンスを生成。
・setTypeでインテントにカテゴリを付加し、
putExtraでデータの種類とデータを渡している。
[参考]
http://www.sakc.jp/blog/archives/24833
その他
No files are open
Android Studioでプロジェクトを開いたら以下のようにNo files are open とでてファイルが開かなくなっていたが、左側の1: Projectを押せば復活しました。
getCurrentItem
Viewpagerで現在のページ位置を取得する場合には以下で取得可能。
int currentViewpagerItem = ((ViewPager)findViewById(R.id .viewpager )).getCurrentItem ()
android:textAppearance
xmlでテキストのスタイル定義の設定を指定する。
要素
説明
?android:textAppearanceSmall
小さいサイズ
?android:textAppearanceMedium
普通のサイズ
?android:textAppearanceLarge
大きいサイズ
[参考]
http://androidguide.nomaki.jp/html/widget/textview/fontsize.html
setOnPageChangeListenerが取り消し線になっている
ViewPagerでsetOnPageChangeListenerを使おうとしたら以下のように取り消し線になってました。
Google Developer で調べてみると以下のように別のを使えということなので、addOnPageChangeListenerを使いました。
android:scaleType
画像サイズの設定を指定する。
ScaleType
画像サイズ
表示位置
CENTER
サイズ変更なし
中央
CENTER_TOP
ボタンの横幅いっぱいに拡大
中央
FIT_CENTER
ボタンの縦幅いっぱいに拡大
中央
FIT_END
ボタンの横幅いっぱいに拡大
右寄せ
FIT_START
ボタンの縦幅いっぱいに拡大
左寄せ
FIT_XY
ボタンの横幅いっぱいに拡大
android:lineSpacingMultiplier
改行時のテキストの行間の余白の高さを指定します。
android:lineSpacingMultiplier = “0.8”
ViewPagerは全画面で設置することが想定されているのか、wrap_contentをサポートしておらず、 android:layout_height=”wrap_content”とすると、高さが0になってしまうとのこと。
高さが設定できないので、layout_weightを使う。
LayoutInflater
以下とのことです。
Androidのプログラミングでは、画面のViewを構成する場合、layout用xml ファイルを用いて、レイアウトを作成することが推奨されている。
しかし、xml ファイルを用いた場合、それは、静的にレイアウトが決定付けられてしまい、プログラムの実行時にレイアウトを変形することはできない。
この不都合を回避するため、LayoutInflater Classが用意されており、このクラスを活用することにより、実行時にお好みのレイアウトに変形できる。
[参考]
https://sites.google.com/site/androyerjapan/home/layoutinflater
Error:Execution failed for task ‘:app:compileDebugAidl’. > aidl is missing
Runしたら以下のようなエラーがでた。
#!
Information:Gradle tasks [:app:assembleDebug]
:app:preBuild UP-TO-DATE
:app:preDebugBuild UP-TO-DATE
:app:checkDebugManifest
:app:preReleaseBuild UP-TO-DATE
:app:prepareComAndroidSupportAppcompatV72220Library UP-TO-DATE
:app:prepareComAndroidSupportSupportV42220Library UP-TO-DATE
:app:prepareDebugDependencies
:app:compileDebugAidl FAILED
Error:Execution failed for task ':app:compileDebugAidl' .
> aidl is missing
Information:BUILD FAILED
ビルドツールがあっていないのではということでapp\build.gradleを確認すると
以下のようにbuildToolsVersion “23.0.0 rc1” となっていた。
#!java
apply plugin: 'com.android.application'
android {
compileSdkVersion 22
buildToolsVersion "23.0.0 rc1"
defaultConfig {
applicationId "com.example.takashin10.actionbarcompat_shareactionprovider"
minSdkVersion 15
targetSdkVersion 22
versionCode 1
versionName "1.0"
}
[対策]
1. [Tools] -> [Android] -> [SDK Manager]
2. Tools (Preview Channel)を見るとbuildToolsVersionで指定している23rc1がNot installed
になっているので、チェックし、Install
3. Android Studioを再起動
しかし、以下のようなエラーがまだでている。
Failed to find Build Tools revision 23.0.0 rc1
[SDK Manger]で確認するとAndroid SDK Build-toolsは23.0.0 rc2になっていた。
app\build.gradleをbuildToolsVersion “23.0.0 rc2” に変えることでエラー回避できた。