xcode4でプロジェクト名とフォルダ名を変更する

アプリを作成していると、途中でプロジェクト名やフォルダ名を変更したくなることはありませんか?
僕はあります。
で、変更してみたのですがいろんなエラーが発生しまして解消するのに一苦労したので備忘録としてここに記しておきます。

プロジェクト名の変更

  1. Project Navigatorを開く(⌘1)
  2. プロジェクトをクリック
  3. File Inspectorを開く([option]⌘1)
  4. Project nameを変更
  5. 変更個所が表示されるので確認して[Rename]をクリック
    スナップショットを取るかどうか聞いてくるのでお好みで
  6. Product -> Clean(⇧⌘K)
  7. Run(⌘R)

もし、Productsの名前が○○.temp_caseinsensitive_rename.appになってしまった場合は、
1.TARGETS -> Build Settings -> ▼Packaging -> Product Name を修正する
2.Project Navigator -> Supporting Files -> ○○.temp_caseinsensitive_rename-Info.plist を修正する
3.TARGETS -> Build Settings -> ▼Packaging -> Info.plist File を修正する
3.TARGETSを選択し、Summaryタブを開く
4.iOS Application Targetに[Choose Info.plist File...]ボタンが表示されるのでクリックし、該当するinfo.plistを選択する
5.Project Navigator -> Supporting Files -> ○○.temp_caseinsensitive_rename-Prefix.pch を修正する

フォルダ名の変更

  1. プロジェクトを開いたままxcodeを閉じる
  2. Finderでプロジェクトが格納されているフォルダ名を変更
  3. プロジェクトファイルと同じ階層のグループフォルダ名を変更
  4. xcodeを開く
  5. Project Navigatorでグループフォルダをクリック
  6. 必要であればFile InspectorのGroup Nameを変更
  7. File InspectorのPathの下の行(Full Pathの上)にフォルダ名が記述されているのでその右側のアイコンをクリック
  8. フォルダ選択のウィンドウが開くのでグループフォルダ(名称が変更されているはず)を選択して[Choose]をクリック
  9. Project Navigatorでプロジェクト名をクリック
  10. TARGETSを選択し、Summaryタブを開く
  11. iOS Application Targetに[Choose Info.plist File...]ボタンが表示されるのでクリックし、該当するinfo.plistを選択する
  12. Build Settingsタブの▼Apple LLVM compiler 4.1 - Languageの中に Prefix Headerという項目があるので空白にする
  13. Clean -> Run

スキーム名の変更

  1. 左上のRun Stopボタンの右にある、[スキーム名>デバイス名]のスキーム名の部分をクリック、一番下の行のManage Schemes...を選択する
  2. Scheme名をダブルクリックすると修正可能になるので修正し、[OK]ボタンを押す

これで、 プロジェクト名.xcodeproj/xcuserdata/.../xcschemes/スキーム名.xcscheme というファイル名が修正されます

| | コメント (0) | トラックバック (0)

Activity で WebViewを使う時は onDestroyで WebView#destroy() を呼んだ方が良いらしい

題名通り。

参考) WebView を持つアクティビティを何個も起動したり閉じたりしているとプロセスが落ちる - プログラマのページ

protected void onDestroy() {
 mWebView.destroy();
 super.onDestroy();
}

| | コメント (0) | トラックバック (0)

Service の起動状態を確認する

起動していたら「止める」、止まっていたら「起動する」ボタンを表示したいので、状態を取得する必要があるのです。

参考) Serviceの起動状態確認 / [Android] | 戯術者の日記

public boolean isServiceRunning(Context c, Class cls) {
ActivityManager am = (ActivityManager) c.getSystemService(Context.ACTIVITY_SERVICE);
List runningService = am.getRunningServices(Integer.MAX_VALUE);
for (RunningServiceInfo i : runningService) {
if (cls.getName().equals(i.service.getClassName())) {
return true;
}
}
return false;
}

| | コメント (0) | トラックバック (0)

Android2.3(Gingerbread)でAddJavascriptInterface を使うと例外発生??

WebViewを使ったHTMLScraping をやってみているんだけど、エミュレータでは動作するのに実機では動作しない。

もしかしたら他に原因があるのかもしれないけど、実機のOSバージョンが 2.3 なので 関連情報をリストアップしておきます。

  1. Quite Noteworthy: Handling Android 2.3 WebView's broken AddJavascriptInterface
  2. フィードに任せっきり: 【Android】より良いAddJavascriptInterface

| | コメント (0) | トラックバック (0)

現在の時刻をミリ秒で取得する

覚えちまえば単純なんだが、なんだか忘れてしまいそうなのでメモ。


long currentTimeMillis = System.currentTimeMillis();

Calendar との連携はこちら
参考)
現在の時刻をミリ秒で取得するには - 逆引きAndroid入門

| | コメント (0) | トラックバック (0)

AdapterクラスのClickListenerの中でActivityを呼び出す方法

これも Context をどうすりゃいいんだ?って話。

Adapterクラスのメンバ変数に Context を持たせるようにする。

参考) java - How to start Activity in adapter? - Stack Overflow

public class MyAdapter extends Adapter {
private Context context;

public MyAdapter(Context context) {
this.context = context;
}

public View getView(...){
View v;
v.setOnClickListener(new OnClickListener() {
void onClick() {
context.startActivity(...);
}
});
}
}

| | コメント (0) | トラックバック (0)

Service から Notification を送る

Service の Context って何だろう?と悩んだので。
普通に this で良いらしい。

参考)
Sending a notification from a service in Android - Stack Overflow


NotificationManager notificationManager =
(NotificationManager) getSystemService(NOTIFICATION_SERVICE);
Notification notification = new Notification(/* your notification */);
PendingIntent pendingIntent = /* your intent */;
notification.setLatestEventInfo(this, /* your content */, pendingIntent);
notificationManager.notify(/* id */, notification);

| | コメント (0) | トラックバック (0)

Service で Content provider から情報取得

managedQuery は Activity のメソッドだから Serviceからは使えない。
Service で Content provider から情報を取得するには ContentResolver#query を使う。

参考)
Android: Content provider access in a service - Stack Overflow


ContentResolver cr = getContentResolver();
Cursor c = cr.query(uri, projection, selection, selectionArgs, sortOrder);

// do something

c.close();

そうそう、よく忘れるのが Cursor#close()
忘れないように癖をつけるようにしないと。

| | コメント (0) | トラックバック (0)

managedQueryでの条件指定(第3引数のselectionの部分)

managedQuery でコンテントプロバイダから情報を取得する時の条件指定方法(Where節の部分)は、以下のサイトを参考にした。

参考)
Contactsからデータを取得する - Android Wiki*


StringBuilder where = new StringBuilder();
where.append(ContactMethods.PERSON_ID).append(" == ").append(id).append(" AND ");
where.append(ContactMethods.KIND).append(" == ").append(Contacts.KIND_POSTAL);
String selection = where.toString();
Cursor addressCursor = managedQuery(ContactMethods.CONTENT_URI, null, selection, null, null);

こんな感じで。

条件にユーザ入力値を使う場合は、 selectionArgs も使用して PreparedStatementのようにしなくちゃいけないけど、自分で用意した値で検索するならば上記で良いかと。

| | コメント (0) | トラックバック (0)

ListViewの拡張方法

独自デザインのListViewを表示したい時には LayoutInflaterを使う。

参考)
ListViewを拡張する方法 | public static void main

上記リンク先は BaseAdapter を継承してアダプタクラスを作り、 ListActivityを継承したActivity で表示している。
荒井先生は ArrayAdapter -> Activity をオススメしてた。

参考)
リストビューをカスタマイズする « Tech Booster

思い通りに表示できればどっちでも構わない。

  1. レイアウト用のxml作成
  2. 表示項目のgetter,setterを実装したクラスを作成
  3. アダプタクラスの作成(getView()で 1.と2.を結びつけて1つの行を作成。LayoutInflaterを使うことでメモリ節約)
  4. アクティビティの作成(データリストを読み込んでListに入れたものを 3.のインスタンスにセットして表示)

| | コメント (0) | トラックバック (0)

«.classpath に書き込めませんでした