CloverQ の公開アプリのプライバシーポリシー
・ネットワーク接続の表示、ネットワークへのフルアクセス
アプリ内広告(AdMob,adstir,AMoAd,Nend,i-mobile)で必要とされています。
AdMob のプライバシーポリシーはこちらです。
adstir のプライバシーポリシーはこちらです。
AMoAd のプライバシーポリシーはこちらです。
Nend のプライバシーポリシーはこちらです。
i-mobile のプライバシーポリシーはこちらです。
2018年9月20日木曜日
2016年8月6日土曜日
Admob のために、Google Play Services を導入
しばらく前から、Admob にて、Google Play Services を使うようになっていたが、更新も手間なので、放置していた。
しかし、古いSDKは、2016年9月15日でサポート終了とのメールが来ている。
というわけで、更新!
エクリプスで作成していたアプリだが、さすがにAndroidStudio を導入。
インポートすると、エラーは出たが、メッセージをみて、インストールとかしてれば、あっさり完了。
※一応、書き換えが必要なものもあった。参考
http://qiita.com/shoma2da/items/1e84807809e7d1f4803b
ビルドできたので、リリースAPKを作ろうとしたところ、エラー。
Error:The number of method references in a .dex file cannot exceed 64K.
どうも dex ファイルを64K以下にしろ、みたいな。
そんなん言われても、導入したの Google Play Services だけだし…。
サポート終了を知らせるメールには、
compile 'com.google.android.gms:play-services:9.0.2'
と記述せよと書いてある。
https://developers.google.com/android/guides/setup
を見てみると、やはり
compile 'com.google.android.gms:play-services:9.4.0'
という書き方をしている。
が、どうもこれがマズイっぽい。
以下を参考に
http://qiita.com/niusounds/items/f9a0ab3cbe07878ed8f6
compile 'com.google.android.gms:play-services-ads:9.4.0'
と書いてみた(赤字が追加部分)ところ、すんなり通った!
そんなわけで、1年以上ぶりのアプリ更新、こちらのブログも更新となりました。
しかし、古いSDKは、2016年9月15日でサポート終了とのメールが来ている。
というわけで、更新!
エクリプスで作成していたアプリだが、さすがにAndroidStudio を導入。
インポートすると、エラーは出たが、メッセージをみて、インストールとかしてれば、あっさり完了。
※一応、書き換えが必要なものもあった。参考
http://qiita.com/shoma2da/items/1e84807809e7d1f4803b
ビルドできたので、リリースAPKを作ろうとしたところ、エラー。
Error:The number of method references in a .dex file cannot exceed 64K.
どうも dex ファイルを64K以下にしろ、みたいな。
そんなん言われても、導入したの Google Play Services だけだし…。
サポート終了を知らせるメールには、
compile 'com.google.android.gms:play-services:9.0.2'
と記述せよと書いてある。
https://developers.google.com/android/guides/setup
を見てみると、やはり
compile 'com.google.android.gms:play-services:9.4.0'
という書き方をしている。
が、どうもこれがマズイっぽい。
以下を参考に
http://qiita.com/niusounds/items/f9a0ab3cbe07878ed8f6
compile 'com.google.android.gms:play-services-ads:9.4.0'
と書いてみた(赤字が追加部分)ところ、すんなり通った!
そんなわけで、1年以上ぶりのアプリ更新、こちらのブログも更新となりました。
2015年7月28日火曜日
2015年7月15日水曜日
シングルトン
以下のサイトを参考に。
https://sites.google.com/site/androidappdojo/home/lesson/section04/section0405
クラスを使うときの new を呼び出し元ではなく、呼び出し先のそのクラス自身に任せる的な。
コンストラクタは、private にして制限。
getInstance() で呼び出すように書く。
とはいえ、コンストラクタがpublic じゃないと、画面回転させた時などに落ちる。
https://sites.google.com/site/androidappdojo/home/lesson/section04/section0405
クラスを使うときの new を呼び出し元ではなく、呼び出し先のそのクラス自身に任せる的な。
コンストラクタは、private にして制限。
getInstance() で呼び出すように書く。
とはいえ、コンストラクタがpublic じゃないと、画面回転させた時などに落ちる。
2015年7月14日火曜日
ダイアログ フラグメント
ダイアログ出すにも、DialogFragment を使えということなのでメモ。
※参考URL
http://developer.android.com/reference/android/app/DialogFragment.html#AlertDialog
http://quesera2.hatenablog.jp/entry/2014/04/09/003146
のFragment→Fragment→Fragment のところ。
http://www.fkmsoft.jp/blog/software/android/fragment/dialog_2.html
アラートダイアログ以外を表示するには、 new AlertDialog.Builder の部分を変更。
ただし表示するものによって、必須の指定があるので、要確認。
たとえば、ドラムロールのTimePickerDialog だと、「~~ extends DialogFragment implements TimePickerDialog.OnTimeSetListener」として、Override で onTimeSet が必須になる。あとなぜか return new ~~~ .create(); じゃだめで、変数宣言して、それをリターンしてやらないとエラーだった。
また、.setView のところ、上記の例では EditText のウィジェットをjavaで生成して入れているが、これも好きなもの(seekbarとか)を入れられるし、レイアウト(XML)で凝ったものでも作ってインフレートしてからセットすることも試してないが、可能かと。
なお、フラグメントから呼び出したダイアログフラグメントより、呼び出し元のフラグメントへ処理を返す方法も記述。
呼び出す際に setTargetFragment しておき、呼び出し先で、getTargetFragment にて取得し、onActivityResult で返してやる。
※最後に。 上記の例では、フラグメントと、ダイアログフラグメントを分離しているが、
フラグメントクラス内にダイアログフラグメントを記述する場合は、public static とする。
「public class MyAlertDialogFragment extends DialogFragment」
↓
「public static class MyAlertDialogFragment extends DialogFragment」
意味としては、これは親クラスとは関係ないよ、という宣言。
※参考URL
http://developer.android.com/reference/android/app/DialogFragment.html#AlertDialog
http://quesera2.hatenablog.jp/entry/2014/04/09/003146
のFragment→Fragment→Fragment のところ。
http://www.fkmsoft.jp/blog/software/android/fragment/dialog_2.html
アラートダイアログ以外を表示するには、 new AlertDialog.Builder の部分を変更。
ただし表示するものによって、必須の指定があるので、要確認。
たとえば、ドラムロールのTimePickerDialog だと、「~~ extends DialogFragment implements TimePickerDialog.OnTimeSetListener」として、Override で onTimeSet が必須になる。あとなぜか return new ~~~ .create(); じゃだめで、変数宣言して、それをリターンしてやらないとエラーだった。
また、.setView のところ、上記の例では EditText のウィジェットをjavaで生成して入れているが、これも好きなもの(seekbarとか)を入れられるし、レイアウト(XML)で凝ったものでも作ってインフレートしてからセットすることも試してないが、可能かと。
なお、フラグメントから呼び出したダイアログフラグメントより、呼び出し元のフラグメントへ処理を返す方法も記述。
呼び出す際に setTargetFragment しておき、呼び出し先で、getTargetFragment にて取得し、onActivityResult で返してやる。
※最後に。 上記の例では、フラグメントと、ダイアログフラグメントを分離しているが、
フラグメントクラス内にダイアログフラグメントを記述する場合は、public static とする。
「public class MyAlertDialogFragment extends DialogFragment」
↓
「public static class MyAlertDialogFragment extends DialogFragment」
意味としては、これは親クラスとは関係ないよ、という宣言。
2015年7月10日金曜日
Calendar
カレンダークラスで日時などを指定する方法
・共通
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.setTimeZone(TimeZone.getDefault());
・毎日
例えば11時10分0秒なら、
calendar.set(Calendar.HOUR_OF_DAY, 11);
calendar.set(Calendar.MINUTE, 10); //02などはいけるが、なぜか08以降はダメ。0不要か。
calendar.set(Calendar.SECOND, 0);
※時間指定のみなので、毎日となる。
※なお、秒を指定しないと1分程度遅れた。0秒指定で端末時間でジャスト起動。
・比較
各変数は、以下とする。
現在時刻:calendarNow
設定時刻:calendarSet
int num = calendarNow.compareTo(calendarSet);
if(num>0){
Log.d("time","現在時刻が、設定時刻より進んでいる。");
}
・メソッドなど詳しく紹介しているサイト
http://www.techscore.com/tech/Java/JavaSE/Utility/8/
add と roll の違いなど。
・翌日
今日のCalendar.DAY_OF_YEARがsetされているor最初から何も指定していないとして、
calendar.add(Calendar.DAY_OF_YEAR, 1);
すれば、翌日。
Calendar.DAY_OF_YEAR は一年のうちで、今日が何日目か。
なお年末でも大丈夫。
・時刻取得
get メソッドで取得。何もsetしてなければ、現在時刻を取ってくる。
int hour = calendarNow.get(Calendar.HOUR_OF_DAY);
※何かsetしていると、その設定したものを取ってくる。
・正確さ
秒まで指定しないと、1分くらい遅れた。(0秒指定で、分変わりジャスト)
・備考
calendar.set(Calendar.MINUTE, 5);
みたいに数字を書く。
たとえば05という風に書くと、08からなぜかエラー。
・共通
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.setTimeZone(TimeZone.getDefault());
・毎日
例えば11時10分0秒なら、
calendar.set(Calendar.HOUR_OF_DAY, 11);
calendar.set(Calendar.MINUTE, 10); //02などはいけるが、なぜか08以降はダメ。0不要か。
calendar.set(Calendar.SECOND, 0);
※時間指定のみなので、毎日となる。
※なお、秒を指定しないと1分程度遅れた。0秒指定で端末時間でジャスト起動。
・比較
各変数は、以下とする。
現在時刻:calendarNow
設定時刻:calendarSet
int num = calendarNow.compareTo(calendarSet);
if(num>0){
Log.d("time","現在時刻が、設定時刻より進んでいる。");
}
・メソッドなど詳しく紹介しているサイト
http://www.techscore.com/tech/Java/JavaSE/Utility/8/
add と roll の違いなど。
・翌日
今日のCalendar.DAY_OF_YEARがsetされているor最初から何も指定していないとして、
calendar.add(Calendar.DAY_OF_YEAR, 1);
すれば、翌日。
Calendar.DAY_OF_YEAR は一年のうちで、今日が何日目か。
なお年末でも大丈夫。
・時刻取得
get メソッドで取得。何もsetしてなければ、現在時刻を取ってくる。
int hour = calendarNow.get(Calendar.HOUR_OF_DAY);
※何かsetしていると、その設定したものを取ってくる。
・正確さ
秒まで指定しないと、1分くらい遅れた。(0秒指定で、分変わりジャスト)
・備考
calendar.set(Calendar.MINUTE, 5);
みたいに数字を書く。
たとえば05という風に書くと、08からなぜかエラー。
2015年7月9日木曜日
R.id.hoge とかのリソースを動的に読み込む方法
以前の記事で、最後に触れている
http://yazakikenji.blogspot.jp/2011/12/imageview.html
が、再掲。
例。
ImageView imageView;
imageView = (ImageView) getView().findViewById(R.id.imageView1);
同じことを動的にやるには、
String str = "1";
imageView = (ImageView) getView().findViewById(getResources().getIdentifier("imageView"+str,"id",getActivity().getPackageName()));
実際には、上記のstrは数字(連番)で持たせて処理の中で、forループなどで使う形になると思う。
・getIdentifier の詳細
第一引数は、XML ファイルで定義したIDを入れる。
同一の名前で最後に数字を連番でつけるのが楽か。(名前が違うと当然エラーになるので注意!XML側でつけたIDの命名規則が一部違っているとかもそう。)
第二引数は、
R.id なら"id"
R.drawable なら"drawable"
となる。
第三引数は、パスの指定だが、それはパッケージ名となる。getPackageName() を使わず、直書きでもいい。なおフラグメントで使うことを想定して、getActivity() している。
http://yazakikenji.blogspot.jp/2011/12/imageview.html
が、再掲。
例。
ImageView imageView;
imageView = (ImageView) getView().findViewById(R.id.imageView1);
同じことを動的にやるには、
String str = "1";
imageView = (ImageView) getView().findViewById(getResources().getIdentifier("imageView"+str,"id",getActivity().getPackageName()));
実際には、上記のstrは数字(連番)で持たせて処理の中で、forループなどで使う形になると思う。
・getIdentifier の詳細
第一引数は、XML ファイルで定義したIDを入れる。
同一の名前で最後に数字を連番でつけるのが楽か。(名前が違うと当然エラーになるので注意!XML側でつけたIDの命名規則が一部違っているとかもそう。)
第二引数は、
R.id なら"id"
R.drawable なら"drawable"
となる。
第三引数は、パスの指定だが、それはパッケージ名となる。getPackageName() を使わず、直書きでもいい。なおフラグメントで使うことを想定して、getActivity() している。
2015年7月7日火曜日
レイアウトのクリック可能範囲と、バックグラウンドの反応
java 側にて、OnClickListener を設定したり、
Layout (XML) 側にて、クリック可能なものを設置した場合、
クリック可能範囲が、(なんと表現すべきか)XMLタグの深い方(中にある方)が優先される模様。
なので、例えば表のLinearLayout のbackground に、クリックしたら色が変わるような設定のファイルを置いても、(もちろんclickable="true")
その内部のLinearLayout でもTextView、ImageView でも、クリック可能になった場合、そのクリックイベントが優先されるため、表のLinearLayout の設定は生きない。
もっとも、何かしら隙間があれば、そこをタッチすれば、そこだけは反応してくれるが。
Layout (XML) 側にて、クリック可能なものを設置した場合、
クリック可能範囲が、(なんと表現すべきか)XMLタグの深い方(中にある方)が優先される模様。
なので、例えば表のLinearLayout のbackground に、クリックしたら色が変わるような設定のファイルを置いても、(もちろんclickable="true")
その内部のLinearLayout でもTextView、ImageView でも、クリック可能になった場合、そのクリックイベントが優先されるため、表のLinearLayout の設定は生きない。
もっとも、何かしら隙間があれば、そこをタッチすれば、そこだけは反応してくれるが。
ListFragment の使い方
リストフラグメント。
実装するクラスに、extends ListFragment して、以下。
fragment_test.xml
id のとこ、android:list とするのね。 test.xml は省略。
なお、リストをクリックすると、別のフラグメントが起動するよう処理を書いている。
その際、newInstance() などと書いているが、この手の実装は次の投稿で。
実装するクラスに、extends ListFragment して、以下。
fragment_test.xml
id のとこ、android:list とするのね。 test.xml は省略。
なお、リストをクリックすると、別のフラグメントが起動するよう処理を書いている。
その際、newInstance() などと書いているが、この手の実装は次の投稿で。
2015年7月6日月曜日
LinearLayout で作成したリスト的なものに、ListViewで使われる罫線を入れる。また、タッチした時に背景の色が変わるようにする。
・罫線
layout 配下に適当な名前で、以下を作成。
layout 配下に適当な名前で、以下を作成。
hoge.xml
<View xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="1dp" android:background="?android:attr/listDivider" />
あとは、差し込みたい場所に
<include layout="@layout/hoge" />
で入れる。
・タッチ時背景色変更
プロジェクト作成時に、自動的に?作られていたものを設定。
android:background="@drawable/stamp_item_bg"
stamp_item_bg.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:state_pressed="true"
android:drawable="@drawable/stamp_item_bg_pressed" />
<item android:drawable="@android:color/transparent" />
</selector>
・タッチ時背景色変更
プロジェクト作成時に、自動的に?作られていたものを設定。
android:background="@drawable/stamp_item_bg"
stamp_item_bg.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:state_pressed="true"
android:drawable="@drawable/stamp_item_bg_pressed" />
<item android:drawable="@android:color/transparent" />
</selector>
2015年7月2日木曜日
リストにヘッダーをセットした場合の注意点
リスト表示のヘッダー、フッターに何かを挿入したい場合。
TextView textView = new TextView(getActivity());
textView.setText("This is Header");
getListView().addHeaderView(textView, null, false);
アダプターの追加
setListAdapter(adapter);
みたいに、
setListAdapter() する前に addHeaderView() してあげる必要がある。
しかし、ここで注意点。
このままだと、他画面に移って、また上記の画面に戻った場合、エラーで落ちる。
理由は、既にsetListAdapter() されてるから addHeaderView() できません。
つまり、アダプターが破棄されずに残っている。
これを回避するには、
@Override
public void onDestroyView() {
super.onDestroyView();
setListAdapter(null);
}
このように、onDestroyView() にて、アダプターをnull してやる。
なお、アウトオブメモリー対策にもなる模様。
TextView textView = new TextView(getActivity());
textView.setText("This is Header");
getListView().addHeaderView(textView, null, false);
アダプターの追加
setListAdapter(adapter);
みたいに、
setListAdapter() する前に addHeaderView() してあげる必要がある。
しかし、ここで注意点。
このままだと、他画面に移って、また上記の画面に戻った場合、エラーで落ちる。
理由は、既にsetListAdapter() されてるから addHeaderView() できません。
つまり、アダプターが破棄されずに残っている。
これを回避するには、
@Override
public void onDestroyView() {
super.onDestroyView();
setListAdapter(null);
}
このように、onDestroyView() にて、アダプターをnull してやる。
なお、アウトオブメモリー対策にもなる模様。
2015年5月12日火曜日
2015年2月27日金曜日
Fragment
フラグメントのメモ。
正直、フラグメントは勝手が分からず、ツラい。
・前の画面(前のフラグメント)に戻る。
getFragmentManager().popBackStack();
と書けばいい。
ただし、フグラメントがネスト(※)されている時、子フラグメントからだと、上記コードでは無理。
getParentFragment() を使って、親フラグメントを取得する必要がある。
つまり、
getParentFragment().getFragmentManager().popBackStack();
となる。
※ネスト…フラグメントからフラグメントを呼び出している(親フラグメントから子フラグメント)。
getChildFragmentManager とか使ってるパターン。
・アクティビティで出来たことを、フラグメント内でやる場合のパターン
getActivity() を使う。
正直、フラグメントは勝手が分からず、ツラい。
・前の画面(前のフラグメント)に戻る。
getFragmentManager().popBackStack();
と書けばいい。
ただし、フグラメントがネスト(※)されている時、子フラグメントからだと、上記コードでは無理。
getParentFragment() を使って、親フラグメントを取得する必要がある。
つまり、
getParentFragment().getFragmentManager().popBackStack();
となる。
※ネスト…フラグメントからフラグメントを呼び出している(親フラグメントから子フラグメント)。
getChildFragmentManager とか使ってるパターン。
・アクティビティで出来たことを、フラグメント内でやる場合のパターン
getActivity() を使う。
2015年1月12日月曜日
[Android] 一部の文字の色を変える。
文字に下線を引くとかだと、XMLのみの記述でいけるが、色の変更は反映してくれないようだ。
解決方法としては、java側で文字をセットする。
その際、Html.fromHtml() を使う。
TextView textView = (TextView) findViewById(R.id.hoge);
textView.setText(Html.fromHtml(getString(R.string.piyo)));
あとは、
<string name=“piyo”>テスト<font color=\"red\">色を変えたい文字</font>テスト</string>
こんな感じで書く。
※<>は、< > と書いたり。
解決方法としては、java側で文字をセットする。
その際、Html.fromHtml() を使う。
TextView textView = (TextView) findViewById(R.id.hoge);
textView.setText(Html.fromHtml(getString(R.string.piyo)));
あとは、
<string name=“piyo”>テスト<font color=\"red\">色を変えたい文字</font>テスト</string>
こんな感じで書く。
※<>は、< > と書いたり。
2014年12月30日火曜日
[Android] クリック ボタンの設置
(テンプレを変更して、コードが分かりやすい表示を導入しました。)で本題。
※フラグメントで書く場合。
・onCreateView に書くとnull
・getView() を使う。
imgView.setOnClickListener(new OnClickListener());
@Override
public void onClick(View view) {}
みたいに書くのがテンプレ?
だけど、上記のように書いたほうが良いみたい。
※フラグメントで書く場合。
・onCreateView に書くとnull
・getView() を使う。
2013年12月13日金曜日
久々にSDK更新して、
微妙にトラブったのでメモ。
・レイアウトファイルで何故かエラー
http://logicalerror.seesaa.net/article/317880979.html
参照。
CTRL+SHIFT+F でソースを整形すればOK。
・何故かビルド失敗
http://kokufu.blogspot.jp/2013/11/android-sdk-bufferoverflowexception.html
参照。
Android 4.2.2 APIレベル17 でも失敗。
Android 4.4 APIレベル19 にして成功。
・レイアウトファイルで何故かエラー
http://logicalerror.seesaa.net/article/317880979.html
参照。
CTRL+SHIFT+F でソースを整形すればOK。
・何故かビルド失敗
http://kokufu.blogspot.jp/2013/11/android-sdk-bufferoverflowexception.html
参照。
Android 4.2.2 APIレベル17 でも失敗。
Android 4.4 APIレベル19 にして成功。
2012年10月22日月曜日
Adstir 実装方法変更メモ
広告振り分けでAdstir を使っていますが、ちょっと前に実装方法が変更されています。
修正ついでに更新したので、エラーになったところをメモ。
onDestroy() に、
AdstirTerminate.init(this);
を追加すると、init に赤線。(※Eclipse 使用)
The method init() in the type AdstirTerminate is not applicable for the arguments
新しいSDK が反映されてないのかな?と、プロジェクトをクリーン。(※上部メニューバーのproject からClean を実施。)
すると、init の赤線は消えたものの、今度は、AdstirTerminate と、以下に赤線。
import com.ngigroup.adstir.AdstirTerminate;
import com.ngigroup.adstir.AdstirView;
上記2つのインポートを削除してから、
AdstirTerminate の赤線をポイントして、選択肢からimport ~ を選択。
import com.ad_stir.AdstirTerminate;
が追加され、エラーは消えてくれました。
修正ついでに更新したので、エラーになったところをメモ。
onDestroy() に、
AdstirTerminate.init(this);
を追加すると、init に赤線。(※Eclipse 使用)
The method init() in the type AdstirTerminate is not applicable for the arguments
新しいSDK が反映されてないのかな?と、プロジェクトをクリーン。(※上部メニューバーのproject からClean を実施。)
すると、init の赤線は消えたものの、今度は、AdstirTerminate と、以下に赤線。
import com.ngigroup.adstir.AdstirTerminate;
import com.ngigroup.adstir.AdstirView;
上記2つのインポートを削除してから、
AdstirTerminate の赤線をポイントして、選択肢からimport ~ を選択。
import com.ad_stir.AdstirTerminate;
が追加され、エラーは消えてくれました。
登録:
投稿 (Atom)