2015年6月7日日曜日

GoogleサンプルでAndroidアプリを学ぶ(ActionBarCompat-ShareActionProvider)

GoogleサンプルでAndroidアプリを学ぶ(ActionBarCompat-ShareActionProvider)

しばらくぶりにAndroidの勉強をしようと思い、Googleのサンプルから始めることにしました。
勉強の仕方としては、サンプルを参考に、1からプロジェクトを作ってサンプルを移植していきます。
いつまで続くかわかりませんが。。

[開発環境]
 Android Studio
[使用したサンプル]
 ActionBarCompat-ShareActionProvider
[機能]
 ・ページを切り替えるとテキストとassetsに格納された画像の表示を切り替える。
 ・表示されているコンテンツを他のアプリとShareする。

学んだことを記載します。

Assets

Assetsフォルダの追加

このサンプルではassetsフォルダにある画像を表示しておりますが、Android Studioにはassetsフォルダ自身が作成されてません。なので以下の手順でassetsフォルダを作成しました。

Step1. 表示を「Android」から「Project」へ変更
enter image description here

Step2. app\mainで右クリックし、「New」→「Directory」でassetsを作成
enter image description here

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)

enter image description here
のアイコンを出すために以下が必要。

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する必要があるので注意が必要。

イメージとしては以下のような感じな気がする。

enter image description here

//import android.widget.ShareActionProvider;
import android.support.v7.widget.ShareActionProvider;

private ShareActionProvider mShareActionProvider;

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        MenuItem shareItem = menu.findItem(R.id.menu_share);
        mShareActionProvider = (ShareActionProvider) MenuItemCompat.getActionProvider(shareItem);

    // 今、Viewpagerに表示されているものをIntentする。
        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;
    }

PagerAdapter

ViewPagerに表示するための仕組みがよくわからなかったので、簡単な図にしてみました。
ViewPagerで表示する中身を生成するためのAdapter(PagerAdapter)を使ってます。

enter image description here

暗黙的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を押せば復活しました。
enter image description here

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を使おうとしたら以下のように取り消し線になってました。
enter image description here

Google Developerで調べてみると以下のように別のを使えということなので、addOnPageChangeListenerを使いました。

enter image description here

android:scaleType

画像サイズの設定を指定する。

ScaleType 画像サイズ 表示位置
CENTER サイズ変更なし 中央
CENTER_TOP ボタンの横幅いっぱいに拡大 中央
FIT_CENTER ボタンの縦幅いっぱいに拡大 中央
FIT_END ボタンの横幅いっぱいに拡大 右寄せ
FIT_START ボタンの縦幅いっぱいに拡大 左寄せ
FIT_XY ボタンの横幅いっぱいに拡大

android:lineSpacingMultiplier

改行時のテキストの行間の余白の高さを指定します。
android:lineSpacingMultiplier = “0.8”

ViewPagerのレイアウト

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
範囲を選択_120.png
3. Android Studioを再起動

しかし、以下のようなエラーがまだでている。
Failed to find Build Tools revision 23.0.0 rc1

[SDK Manger]で確認するとAndroid SDK Build-toolsは23.0.0 rc2になっていた。
範囲を選択_122.png

app\build.gradleをbuildToolsVersion “23.0.0 rc2” に変えることでエラー回避できた。

0 件のコメント :

コメントを投稿