raw文字列

「raw文字列」とはなんぞや??

ようは、エスケープシーケンスを無効にした文字列ということでした。


通常、プログラミングでは文字列に「\n(改行)」などのように
エスケープシーケンスを使用した文字を使用しますが、
raw文字列というのは、「\n」の場合、「\」と「n」の文字といったように
表示そのものと解釈される。

記述方法は

 r"文字列"
 R"文字列"
 r'文字列'
 R'文字列'
 @'文字列'
   ・・・など

という風に、文字列の前に"r"などのプレフィックスをつけることで
raw文字列として扱われる。
プレフィックスの種類はプログラミング言語によって異なるのかな。


[Android] 他のアプリを起動する

カメラアプリとかブラウザアプリとか、限定せずに
アプリを起動したいと考えたとき、ちょっとハマったので、
忘れないようにメモしておきます。

ようは、Intentを使って起動するんですが、
アプリを指定して明示的なIntentを使用する場合、
パッケージ名と起動先のActivity名が必要となる。

パッケージ名はパッケージマネージャからすぐに取得できたのですが、
Activity名を取得する方法が分からず、かなり苦労した。。。

★コードは以下

intent = new Intent(Intent.ACTION_MAIN, null);
intent.addCategory(Intent.CATEGORY_LAUNCHER);

List appInfo = mActivity.getPackageManager().queryIntentActivities(intent, 0);
for (ResolveInfo info : appInfo) {
if (info.activityInfo.applicationInfo.packageName.equals("起動したいパッケージ名")) {
ComponentName componentName;
componentName = new ComponentName(info.activityInfo.applicationInfo.packageName, info.activityInfo.name);
int launchFlag = Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED;
intent.setComponent(componentName);
intent.setFlags(launchFlag);
startActivity(intent);
}
}


"ResolveInfo.activityInfo.name"から起動先のActivity名を取得できました。
一応、動作を確認したらアプリ起動ができたので問題無いのかな??

Cygwinをインストール

AndroidでJNIを勉強しようかなと思い、
cファイルをコンパイルするためにCygwinを導入したので
インストール手順をメモ。

以下のページから、「setup.exe」を選択してインストーラをダウンロードする
http://cygwin.com/install.html

cygwin_install_01


・ダウンロードしたインストーラを起動


cygwin_install_02

・「次へ」を選択


cygwin_install_03

・そのまま「次へ」を選択

cygwin_install_04

・そのまま「次へ」を選択


cygwin_install_05

・そのまま「次へ」を選択


cygwin_install_06

・そのまま「次へ」を選択


cygwin_install_07

・任意のダウンロード先を選択して「次へ」を選択


cygwin_install_08

・make、gcc4、gdb、libexpat1を選択して「次へ」を選択


cygwin_install_09

・そのまま「次へ」を選択


cygwin_install_10

・そのまま「完了」を選択



これでインストールは完了。
デスクトップに作成されたショートカットからCygwinを起動することができる。

[Java] singleton

Javaではnewをしてインスタンスをいくつも生成することができるのですが、
一つしか作らせたくない場合などは、どうすればいいのか??

newを1回に限定すれば、別に生成されるインスタンスは1つだけに
なるのですが、そんなの管理するのは面倒だし、忘れちゃって、
もうひとつインスタンスの生成をしてしまったりしそう。

これを防ぐため、singletonという構造がある。


簡単に説明すると、
コンストラクタをprivateにして、外部のクラスからnewできないようにする。
そして、インスタンスを取得するメソッドを定義して、インスタンス取得時に
インスタンスが無い場合は生成をして、メンバ変数として保持する。



public class TestClass {
/** インスタンスを保持するためのメンバ変数 */
private static final TestClass instance;

/**
* コンストラクタ
* private指定で、他のクラスからnewさせない
*/
private TestClass() {
}

/**
* このメソッドでインスタンスを取得できる
* インスタンスが無い場合はnewして生成する
*/
public static TestClass getInstance() {
// インスタンスが無い場合、newしてインスタンス生成をする
if (instance == null) {
instance = new TestClass()
}

// インスタンスを返す
return instance;
}
}


ただ、自分自身をつかみ続けるので、GCの対象にならないので
メモリーリークなどの注意は必要


[Android] アプリケーションの詳細画面を起動する

アプリケーションの詳細画面は、設定から起動することができるのだが、
今回は、アプリの中から起動する方法をメモ。

Androidのバージョンにより、方法が異なるため、以下のように
バージョンごとに処理を分けるようにした。


// Androidのバージョンで処理を分ける
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.FROYO) {
// Android 2.3以上
Intent intent = new Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS, Uri.parse("package:" + "★パッケージ名を指定"));
startActivity(intent);
} else {
// Android 2.2以下
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setClassName("com.android.settings", "com.android.settings.InstalledAppDetails");
intent.putExtra("pkg", "★パッケージ名を指定");
startActivity(intent);
}



[Android] バージョンごとに処理を分ける

Androidでは、osのバージョンが2.Xはスマートフォン向けで、3.Xはタブレット向けだったりと
バージョンによって大きな違いがあったりする。
新規のAPIが追加されたり、突然非推奨になってたりと動きも激しい。

そんな時、バージョンごとに処理を切り替えられたらということで、
以下をメモしておく。

サンプルとして、2.X系(APIレベル10以下)と3.X系(APIレベル11以上)で処理を分ける

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
// APIレベル11以上の処理を記載
} else {
// APIレベル10以下の処理を記載
}


「Build.VERSION.SDK_INT」はデバイス側のバージョン。
「Build.VERSION_CODES.HONEYCOMB」を判定したいバージョンを指定する。
たとえば、2.2(APIレベル8)なら、「Build.VERSION_CODES.FROYO」など。


[Android] OnItemClickListener#onItemClick()が呼び出されない

GridViewの各アイテムを選択(クリック)したときに、
選択されたアイテムごとに処理を行うために、
OnItemClickListenerを実装したクラスを用意して、
setOnItemClickListener()でリスナーを設定してみた。

■OnItemClickListenerを実装したクラス
 public class GridOnItemClick implements OnItemClickListener {
   @Override
   public void onItemClick(AdapterView parent, View v, int position, long id) {
     // 処理・・・
   }
 }

■GridViewにリスナーを設定
 GridView gridview = (GridView)findViewById(R.id.grid_test);
 gridview.setOnItemClickListener(new GridOnItemClick());

これで、アイテムをクリックしたときにonItemClick()が呼び出されて、
処理が実行されるはずなんだけど、なぜかクリックしてもonItemClick()が
呼び出されない。。。



ちょっと、悩んだが原因はGridViewのアイテムの中のViewでクリックイベントが
奪われてしまっていることが原因だったようだ。

今回は、ImageViewとTextViewをもつレイアウトを指定していた。
そのため、各Viewにfocusableを設定してフォーカスが当たらないように
することでクリックイベントが奪われなくなった。

 android:focusable="false"


これを指定したら、onItemClick()が呼び出されるようになり、
問題は解決した!!



プロフィール

hiiro

Author:hiiro

最新記事
カテゴリ
月別アーカイブ
最新コメント
最新トラックバック
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR
Counter