2013年10月19日土曜日

[Mac] ダウンロードしたアプリが「壊れているためひらけません」と表示される

Android Studioの新しいバージョンをダウンロードしたけど、「"Android Studio.app"は壊れているため開けません。"ゴミ箱"に入れる必要があります。」と表示されて起動できない。


ダウンロードに失敗したかと思い、再度ダウンロードしましたがダメでした。
試行錯誤している内に、「システム環境設定」のセキュリティ設定を変えることで起動できました。

「ダウンロードしたアプリケーションの実行許可」の設定を「すべてのアプリケーションを許可」に一時的に変更しました。一度アプリ起動すれば、それ以降は設定を戻しても問題なかったです。


2013年10月9日水曜日

[Android SDK] ダイアログを自由にカスタマイズする

メモガキの日時設定画面はダイアログをカスタマイズして作成している。Dialogを継承して、onCreateをオーバライドしてsetContentViewを自由なレイアウトを指定します。タイトルバーや境界線を無くし、全画面表示にしています。


  1. public class TestDialog extends Dialog {  
  2.  /* 〜〜〜 一部省略 〜〜〜*/  
  3.  @Override  
  4.  protected void onCreate(Bundle savedInstanceState) {  
  5.   super.onCreate(savedInstanceState);  
  6.   
  7.                 // タイトルバーを非表示にする  
  8.   requestWindowFeature(Window.FEATURE_NO_TITLE);   
  9.   
  10.   setContentView(R.layout.dlg_deadline);  
  11.   
  12.                 // ダイアログの背景(境界線)を無くす(透明)  
  13.   getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));  
  14.   
  15.                 // ダイアログの大きさ最大にする(任意のサイズも指定可能)  
  16.                 getWindow().setLayout(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT);  
  17.   
  18.  }  
  19.  /* 〜〜〜 一部省略 〜〜〜*/  
  20. }  

2013年10月7日月曜日

[Android SDK] 動的に設定画面(Preference)を作成する

ほとんどのAndroidアプリには設定画面が用意されている。

(例:メモガキの設定画面)

こういった設定画面は、.xmlファイルに記述するケースが多いが動的にプログラミングで作成することもできる。
例えば、デバッグ時、AndroidOSのバージョンに応じて表示する設定項目の場合に使える。

1から作成する場合

まずは設定項目を作成するために、PreferenceManagerを取得する。
  1. // For Activity  
  2. PreferenceManager PreferenceActivity::getPreferenceManager()  
  3.   
  4. // For Fragment  
  5. PreferenceManager PreferenceFragment::getPreferenceManager()  
PreferenceManagerで設定項目のルート項目を作成する。
  1. PreferenceScreen PreferenceManager::createPreferenceScreen(Context context);  
以降は、設定項目を作成して追加して行く。
  1. // Context context;  
  2. PreferenceScreen root = getPreferenceManager().createPreferenceScreen(context);  
  3. PreferenceCategory category = new PreferenceCategory(context);  
  4. category.setTitle("Category");  
  5. root.addPreference(category);  
  6.   
  7. PreferenceScreen item = getPreferenceManager().createPreferenceScreen(context);  
  8. item.setTitle("Item");  
  9. category.add(item);  
最後に、設定画面に設定する。
  1. // For Activity  
  2. // void PreferenceScreen::setPreferenceScreen(PreferenceScreen preferenceScreen)  
  3. //   
  4. // For Fragment  
  5. // void PreferenceFragment::setPreferenceScreen(PreferenceScreen preferenceScreen)  
  6. //  
  7. setPreferenceScreen(root);  

既存の設定画面に追加する場合

既存の設定項目のルート項目を取得する。
  1. // For Activity  
  2. PreferenceScreen PreferenceActivity::getPreferenceScreen()  
  3.   
  4. // For Fragment  
  5. PreferenceScreen PreferenceFragment::getPreferenceScreen()  
取得したルート項目にさきほどと同様に追加していく。


参考までに

メモガキではアプリの更新履歴を、ファイル(res/raw)から更新履歴を情報を読み込み、動的に設定画面をベースに表示している。

  1. public class RpNoteVersionFragment extends PreferenceListFragment {  
  2.  @Override  
  3.  public void onCreate(Bundle savedInstanceState) {  
  4.   super.onCreate(savedInstanceState);  
  5.   setPreferenceScreen(createReleaseNote());  
  6.  }  
  7.  public PreferenceScreen createReleaseNote() {  
  8.   final Context c = getActivity();  
  9.   PreferenceScreen root = getPreferenceManager().createPreferenceScreen(c);  
  10.     
  11.   BufferedReader reader = null;  
  12.   InputStream stream = null;  
  13.   String buffer = null;  
  14.   PreferenceCategory category = null;  
  15.   try {  
  16.    stream = c.getResources().openRawResource(R.raw.release_note);  
  17.    reader = new BufferedReader(new InputStreamReader(stream));  
  18.    while ((buffer = reader.readLine()) != null) {  
  19.     if (category == null) {  
  20.      category = new PreferenceCategory(c);  
  21.      category.setTitle(buffer);  
  22.      root.addPreference(category);  
  23.     } else if (buffer.equals("")) {  
  24.      category = null;  
  25.     } else {  
  26.      Preference item = new Preference(c);  
  27.      item.setTitle(buffer);  
  28.      item.setLayoutResource(R.layout.pref_single_item);  
  29.      category.addPreference(item);  
  30.     }  
  31.    }  
  32.   } catch (IOException ioe) {  
  33.      
  34.   } finally {  
  35.    if (reader != null) {  
  36.     try {  
  37.      reader.close();  
  38.     } catch (IOException ioe) {}  
  39.    }  
  40.    if (stream != null) {  
  41.     try {  
  42.      stream.close();  
  43.     } catch (IOException ioe2) {}  
  44.    }  
  45.   }  
  46.   return root;  
  47.  }  
  48. }  
  49.   
  50. // R.raw.release_noteの中身  
  51. Ver.0.3.0  
  52. Append text to an existing note with share.  
  53. Add icons of category.  
  54.   
  55. Ver.0.2.0  
  56. Change an order of category display.  
  57.   
  58. Ver.0.1.1  
  59. Display a widget, today's number of schedules.   
  60.   
  61. Ver.0.0.0  
  62. First version