しばらくぶりに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.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)を使ってます。
暗黙的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のレイアウト
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” に変えることでエラー回避できた。
0 件のコメント :
コメントを投稿