2011年12月27日火曜日

謎のエラーで実行できない(2)


またしても、プロジェクトをビルドしても実行できなくなった。
ちょいとManifest.xmlをいじっていたり、使ってないプロジェクトを閉じたり
していただけなんだけど・・以下のエラーが出る。

> Error generating final archive: Debug certificate expired on ...

解決手順:

1.プロジェクト→クリーンを行う

↓それでも治らない

2.デバッグのキーストアとかゆう情報の期限切れらしい
JDKに付属する keytool というもので、キーストアを再度生成して置き換える
ことで問題は解決した。

●手順 A.キーストアの場所を確認
 →eclipseの「ウィンドウ」「設定」「Android」「ビルド」「Default debug keystore」から
パスを確認

自宅環境では以下の場所だった。
> C:\Documents and Settings\PCのユーザー名\.android\debug.keystore

●手順 B. keytool.exeを用いて、以下のコマンドでキーストアを生成する
keytoolがない場合はJDKをインストールする。
keytoolのパスが通っていない場合は、環境変数にパスを通して置く
自宅環境では以下の場所だった。
> C:\Program Files\Java\jdk1.6.0_23\bin

コマンドプロンプトで以下を実行

keytool -genkey -v -keystore debug.keystore -alias androiddebugkey -keyalg RSA -validity 10000 -dname "CN=Android Debug,O=Android,C=US"

パスワードを要求されるので android と入力する

●手順 C.ファイルの置き換え
C:\Documents and Settings\PCのユーザ名\.android

に debug.keystore というファイルが出来ていたので
それを、Aのファイルに置き換える。

●手順 D.
実機を繋いでいる場合は、一度apkをアンインストールしてから
もう一度、プロジェクトをCleanして実行する


参考サイト
http://magpad.jugem.jp/?eid=151
http://magpad.jugem.jp/?eid=77

2011年12月19日月曜日

ステータスバーに進捗を表示する


1.OnCreate()と、SetContentView()の間にプログレスバーの許可を書く

// プログレスバー許可
requestWindowFeature(Window.FEATURE_PROGRESS);


2. SetContentView()後に、まずはプログレスバーをOFFにしておく

// プログレスバー表示の設定
setProgressBarVisibility(false);

3.以下のメソッドで、プログレスバーを操作

引数は、 0 - 10000 の範囲で進捗を通知する。
10000になるとプログレスバーが消える

setProgress();

以上!

2011年12月18日日曜日

オプションメニューの作り方


使い方は、Activityのメソッドをオーバーライドする方式なので簡単。

○説明
menu.addメソッドでメニューを追加する。
・2番目の引数のMENU_ID01にメニューIDを指定する。Menu.FIRSTから順番に指定していけばOK
・4番目の引数に、メニュー名を指定する 
 
@Override
// オプションメニュー生成時のイベント
public boolean onCreateOptionsMenu(Menu menu)
{
 // オプションメニューを生成、追加する
 MenuItem item = menu.add(Menu.NONE, MENU_ID01, Menu.NONE, "SampleMenu");
 // アイコンを設定する
 // android.R.drawable内にシステムデフォルトのアイコンが多数用意されている
 item.setIcon(android.R.drawable.ic_menu_preferences);
 // キーボードショートカット
 item.setAlphabeticShortcut('e');
 return super.onCreateOptionsMenu(menu);
}

@Override
// オプションアイテムクリック時のイベント
public boolean onOptionsItemSelected(MenuItem item)
{
 switch (item.getItemId())
    {
    case MENU_ID01:
     // メニューが選択されたときの処理
     break;
    default:
        break;
    }
    return super.onOptionsItemSelected(item);
}

@Override
// オプションメニューが閉じられたときのイベント
public void onOptionsMenuClosed(Menu menu)
{
}

2011年12月5日月曜日

実行時にeclipseのコンソールに謎のエラー


ファイルダイアログを作りたかったが
難しそうだったので、フリーの外部ソースをパクって来て
埋め込んだら、突然、以下のエラーが出て起動すらしなくなった。

ERROR: Unknown option '--no-crunch' ~

最初は、コードのバグを疑ったがようやらそうではなかった。
ググッてみたところ、SDK Managerのアップデートしたら解決した。
eclipseのアップデートからだけではダメなようで
SDK Managerを起動して、そこからキチンとupdateしましょう。

いままでのソケット通信をするアプリは、このバージョンで問題なく動いてたのだけど
何からの処理に依存して、上記のエラーが発生するのだろうか・・。

2011年8月30日火曜日

Java言語の不満

以下のように、インターフェースの実装を簡略化して書けるのだが
どうも無理やり押し込んだ感のある文法が好きになれない。
この場合、ローカル変数 localnum を
感覚的に参照出来るそうに見えるが、実際はできない。

その点、C#は、デリゲートやアクセッサがいい役割を果たしていて
かなり感覚的に読みやすいコードが書けるのでオススメだ。

public class Main implements InterfaceA
{
 private int classnum = 10;

 public void Test()
 {
  // パッと見でローカル変数も送れそうな感じがするが送れない
  int localnum = 10;

  // その場でインターフェースを実装
  ClassA a = new ClassA( new InterfaceA()
  {
   // 実装2
   @Override
   public void play()
   {
    //System.out.println("実装1, num=" + localnum); // 当然ローカル変数は NG
    System.out.println("実装1, num=" + classnum);
   }
  });

  a.play(); //  実装1がよばれる

  // 通常
  ClassA b = new ClassA();
  b.setInterfaceA(this);
  b.play(); //  実装2がよばれる
 }

 @Override
 public void play()
 {
  System.out.println("実装2, num=" + classnum);
 }
}
※補足 最近知ったのですが、C# 2.0 では匿名メソッドという機能が用意されていて 上記と似たようなかたちで、delegateに直接関数を実装できるようです。

2011年7月28日木曜日

AppWidgetの作成方法

Androidのホーム画面に貼りつけできるAppWidgetの作り方

1.レイアウト画面の作成
通常アプリ同様 layout/xml 以下にレイアウトを作成する

2. res/xmlフォルダに、appwidget-provider設定ファイルの作成

<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:minWidth="72dip"
  android:minHeight="72dip"
  android:updatePeriodMillis="60000"
  android:initialLayout="@layout/レイアウトのXMLファイル(.xmlは不要)"
/>

○サイズ指定(単位はdip)
・n dip = 74 x n - 2
・nはブロック数。nは1~4まで

・更新間隔(android:updatePeriodMillis)
・30分以下は30分として扱われる
・ミリ秒間隔で、onUpdate()が呼ばれる
・バッググラウンドでも更新が発生する
・0を指定すると、onUpdate()メソッドは一度だけ呼ばれる。
onUpdeteで呼ばれると、インスタンスが再生成されることに注意。
パラメータは、static にすれば保持できる

3.AndroidManifest.xmlの編集

<receiver android:name="クラス名" android:label="アプリ名">
  <intent-filter>
    <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
  </intent-filter>
  <meta-data android:name="android.appwidget.provider" android:resource="@xml/設定用XMLファイル(.xmlは不要)" />
</receiver>

4.コードを記述
AppWidgetProvider を継承したクラスを作成する


public class WordsWidgets extends AppWidgetProvider {

 @Override
 public void onEnabled(Context context) {
  super.onEnabled(context);
 }

 @Override
 public void onUpdate(Context context, AppWidgetManager appWidgetManager,
   int[] appWidgetIds) {
  super.onUpdate(context, appWidgetManager, appWidgetIds);
 }

 @Override
 public void onDeleted(Context context, int[] appWidgetIds) {
  super.onDeleted(context, appWidgetIds);
 }

 @Override
 public void onDisabled(Context context) {
  super.onDisabled(context);
 }

 @Override
 public void onReceive(Context context, Intent intent) {
  super.onReceive(context, intent);
 }
}

2011年7月21日木曜日

レイアウトのまとめ


●レイアウトの指定

◆LinearLayout
縦または横の一列に並べるレイアウト
android:orientation="vertical"か"horizontal"を
指定することで、縦か横かを指定する

○android:orientation
・vertical/horizontal
LinearLayoutを指定したとき設定する
それぞれ縦、横一列に並べることができる

◆RelativeLayout
ヴューの位置を、相対的な位置で指定する
android:gravity属性を指定して、相対的な位置を指定すること


○他のヴィジェットを基準にして、位置を決めるプロパティ
・android:layout_above=”@id/XXXX″
・android:layout_below=”@id/XXXX″
・android:layout_toLeftOf=”@id/XXXX″
・android:layout_toRightOf=”@id/XXXX″
指定されたヴィジェットに対して(上/下/左/右)の場所に配置する

・android:layout_alignTop=”@id/XXXX″
・android:layout_alignBottom =”@id/XXXX″
・android:layout_alignLeft=”@id/XXXX″
・android:layout_alignRight=”@id/XXXX″
指定されたヴィジェットから(上/下/左/右)に整列させる

・android:layout_alignBaseLine=”@id/XXXX″
2つのヴィジェットのベースラインを揃える

●レイアウトパラメータ

◆android:layout_height/android:layout_width

・fill_parent
元のビューのサイズに関係なく可能な限り拡大する
ビューの幅や高さを設定しても無効となる

・match_parent
fill_parentと同じ。 API レベル8以降だと fill_parentではなく
match_parentとする

・wrap_content
表示に必要なサイズに設定する
「setWidth」メソッドや「setHeight」メソッドで
ビューに幅と高さを設定していた場合には、その設定されたサイズに調整される

◆android:gravity
オブジェクトの配置方法を指定する
"|"で区切り複数指定することも出来る

・top/bottom/left/right
上下左右に配置する
・fill_vertical/fill_horizontal
高さ/幅を、コンテナのサイズに合わせる
・fill(default)
高さと幅を、コンテナのサイズに合わせます。
・center_vertical/center_horizontal/center
左右中央/上下中央/上下左右中央に配置し、サイズ変更は行わない

2011年7月18日月曜日

Preferenceの使い方

androidでは、アプリケーションなどの設定情報はXMLファイルとして保存される。
これを簡単に読み書きできる方法がある。

やり方:
1. res/xml 配下に、preferences.xmlを追加する
2. ルートタグ preferencescreen とした、設定用のXMLファイルを記述する
3. PreferenceActivityを継承した、Preference専用のアクティビティを作り
 addPreferencesFromResource()で、先ほど追加したXmlファイルのリソースを指定する
Preference取得方法:
4. PreferenceManager.getDefaultSharedPreferences から、SharedPreferencesを取得する
5. preferences.xmlに指定した key となる文字列を引数にして、設定値を取得する


これだけで実現できる。なんとも便利だ。
あとは、PreferenceScreenのxmlファイルを、書式に沿った書き方をすれば、
チェックボックスや、リストボックスや、テキストボックス等
結構色々な形式での入力方法をサポートしている。

PreferenceCategoryタグでくくることで、カテゴリ分けも可能
以下は、チェックボックスと、テキストボックスを含むpreferences.xmlファイル




 
 

 



以下は、Preferenceの取得コード
引数の2番目には、取得が失敗した時のデフォルト値が入る。


SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(this);
boolean jspEnable = pref.getBoolean("checkbox", false);
string url = pref.getString("url1", "http://google.co.jp");

以下は、Preference用のアクティビティ

public class Preference extends PreferenceActivity
{
 @Override
 public void onCreate(Bundle savedInstanceState)
 {
  super.onCreate(savedInstanceState);
  addPreferencesFromResource(R.xml.preferences);
 }
}

2011年7月14日木曜日

SyntaxHighlighterをBloggerで使う

Android関連ではないですがメモ。
ソースコード貼り付けるときに、行番号を付けて綺麗に整形して貼りつけてくれるスクリプトがあったので
さっそく使ってみた。

public void onCreate(Bundle savedInstanceState)
 {
        super.onCreate(savedInstanceState);

        host = getTabHost();
        host.setOnTabChangedListener(this);

        TabSpec tab[] = new TabSpec[3] ;
        String url[] ={ "http://", "http://", "http://" };

        for(int i=0; i<3; i++)
        {
         // TabSpecを生成
         tab[i] = host.newTabSpec(tabName[i]);
         tab[i] .setIndicator(tabName[i]); // タブに表示する文字列

            // インテントを生成してアドレスを保存する
            intent[i] = new Intent(this, study.android2.Browser.class );

            intent[i].putExtra("url", url[i]);
            tab[i].setContent(intent[i]);
            host.addTab(tab[i]);
        }

        now = intent[0];
        host.setCurrentTab(0);
    }  

かなり綺麗にソースコードを晴れるようになった!超イイ!
 注意点は、JavaScriptを、レイアウトの右下に配置しないと動かなかったこと。

 ※こちらのサイトを参考にさせて頂きました。感謝!
  http://ywafield.blogspot.com/2011/03/yet-another-how-to-use.html

2011年7月13日水曜日

Toastの利用

選択の必要のない、一時的なポップアップメッセージの表示として便利

Toast.makeText(this, "Message", Toast.LENGTH_LONG).show();
 

この1行だけでOK。ちなみにthisはコンテキスト。

2011年7月12日火曜日

デバッグログの出力方法

デバッグメッセージは、以下のコードで出力できる。

Log.d("text","text");

しかし、eclipse上のログ窓が出てないときはどうするか?

eclipseの「ウィンドウ」→「ビューの表示」→「その他」を選択し
androidフォルダ内にある”LogCat”を表示させればOK。

ウィンドウ多すぎですねー。

アクティビティの作成方法

1.ファイル→新規→クラスから android.app.Activity
を継承させたクラスを作成する

2.AndroidManifest.xmlを編集し、アクティビティを追加する。

↓パッケージ名が同じ階層なら以下のような形で記載する

<activity android:name=".ClassName"
 android:icon="@drawable/icon"
 android:label="@string/app_name">
</activity>

マニフェストへの追加を忘れないこと!