スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

指定したメソッドを手軽に遅延実行する方法

Androidに限らず、GUIを持つ多くのアプリケーションでは、イベント処理中に呼び出すとうまくいかないメソッドが存在する。
たとえば、画面起動イベントで画面のコントロールを編集しても反映されず、イベントを抜けた後に実行したらうまくいくパターン。

少しだけ遅れて実行すればうまくいくのに・・・という時に便利なのが、次に紹介する遅延実行。
関数の呼び出しをPOSTしておくと、関数を抜けてから指定時間後に処理が呼び出される。

【呼び出し側】

new Handler().postDelayed( delayFunc, 10);


【呼ばれる側】

private final Runnable delayFunc= new Runnable() {
    @Override
    public void run() {
        // 遅延実行したい処理
    }
};


この場合、postDelayedの第2引数で10を指定しているので、10msec後にrun()が呼ばれる。

そういえば、iPhoneの開発でも同じようなことやった記憶が。
[NSObject performSelector]で遅延実行 - あらきんぐのiPhoneアプリ開発ブログ

こっちはパラメータを渡していたので、Androidでもまた調べておこう。。

theme : プログラミング
genre : コンピュータ

FrameLayoutを使ってレイアウトを重ねる方法(位置指定もOK)

LinearLayoutで画面のオブジェクトを配置していくと、オブジェクト同士を重ねることはできない。
Androidの画面レイアウトは、Wordの文章に図を貼り付けた時のように、オブジェクト同士が干渉しないよう自動調整される。
これはこれで便利なのだが、ちょっとレイアウトを工夫しようと思ったらなかなか上手くいかない場合がある。

そこで、ビューを重ねて配置するのがFrameLayout。このレイアウトは最もシンプルなレイアウトと言われており、中のオブジェクトをとにかく左上に配置する。例えば、タグ内に3つのオブジェクトがあれば、3つとも左上に重ねて表示される。他のレイアウトとは異なり、位置を指定することもできない。それ故に、何のためのレイアウトか良く分からないという意見も。

私も当初、「使えないヤツ」と思っていたけど、そうでもないことが判明。FrameLayout内にLinearLayoutを配置すれば、その中のオブジェクトWidgitはちゃんと位置指定できる。

例えばこんな感じ。


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent">

    <FrameLayout android:layout_width="fill_parent"
      android:id="@+id/frameLayout1"
      android:layout_height="wrap_content">
        <LinearLayout android:layout_width="fill_parent"
          android:id="@+id/linearLayout1"
          android:layout_height="fill_parent"
          android:orientation="vertical">
            <Button android:layout_width="fill_parent"
              android:id="@+id/button1"
              android:text="Button"
              android:layout_height="wrap_content">
            </Button>
            <Button android:layout_width="fill_parent"
              android:id="@+id/button2"
              android:text="Button"
              android:layout_height="wrap_content">
            </Button>
            <Button android:layout_width="fill_parent"
              android:id="@+id/button3"
              android:text="Button"
              android:layout_height="wrap_content">
            </Button>
        </LinearLayout>
        <LinearLayout android:layout_width="fill_parent"
          android:id="@+id/linearLayout2"
          android:layout_height="fill_parent"
          android:orientation="vertical">
            <TextView android:text="TextView"
              android:id="@+id/textView1"
              android:layout_marginLeft="100dp"
              android:layout_marginTop="70dp"
              android:textSize="30sp"
              android:textColor="#FFFF0000"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content">
            </TextView>
        </LinearLayout>
    </FrameLayout>

</LinearLayout>



これで、下のようにボタンとテキストを重ねて表示できる。
flamelayout.jpg

LinearLayout自身を中央寄せ/右寄せ/左寄せにする方法

LinearLayout自身の位置を調整するには、android:layout_gravity属性を指定すれば良い。

例)LinearLayoutを水平方向の中心位置に表示させたい場合

<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_width="314dp"
  android:layout_height="160dp"
  android:layout_marginTop="4dp"
  android:weightSum="1"
  android:layout_gravity="center_horizontal">
 :
 :
</LinearLayout>


theme : プログラミング
genre : コンピュータ

EditTextの編集イベントをリアルタイムに取得する方法

OnEditorActionListenerインターフェースを実装することでEditTextの編集イベントを取得できるが、Enterキーが押されたタイミングまでイベントが発生しないという問題がある。

そこで、リアルタイムにキー入力イベントを取得するには、EditTextのaddTextChangedListenerを使うと良い。、

まず、OnCreate()メソッドで、次のようなコードを書く。


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.game_main_activity);

        editText.addTextChangedListener(watchHandler);
    }


次に、TextWatcherを匿名クラスで定義。


    private TextWatcher watchHandler = new TextWatcher() { 

        @Override 
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
            Log.d(TAG, "beforeTextChanged() s:" + s.toString() + " start:" + String.valueOf(start) + " count:" + String.valueOf(count) +
                       " after:" + String.valueOf(after));
        }

        @Override 
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            Log.d(TAG, "onTextChanged() s:" + s.toString() + " start:" + String.valueOf(start) + " before:" + String.valueOf(before) +
                       " count:" + String.valueOf(count));
        }
       
        @Override
        public void afterTextChanged(Editable s) {
            Log.d(TAG, "afterTextChanged()");
        }
    };



テキスト変更前から変更後にかけて、
 ①beforeTextChanged
 ②onTextChanged
 ③afterTextChanged
の順番でイベントが呼ばれる。
beforeTextChanged()あたりで入力チェック(特定文字だけ入力制限等)が出来そうだが、残念ながらやり方がわからなかった。

theme : プログラミング
genre : コンピュータ

LogCatを使ったログ出力の方法(eclipse環境)

Javaの開発でログ出力といえば「log4j」が有名だが、Androidアプリの開発では「LogCat」を使うのが一般的。

eclipse環境で利用するやり方は以下。

①eclipseでLogCatのウィンドウを表示させる

メニューから、
 ウィンドウ > ビューの表示} > その他
と開き、Android > LogCat を選択したら「OK」をクリック。
logcat-show.jpg

すると、下のようなウィンドウが表示される。このウィンドウにログが出力される。
logcat-window.jpg

②パッケージをインポートする

ソースの先頭(2行目以降)に次のコードを追加。

import android.util.Log;


③ログ出力用のコードを追加

デバッグログを出力させるには、次のメソッドをコールする。


Log.d([タグ文字列], [出力文字]");


Log.d()だけでなく、エラーログや警告などの目的に応じたメソッドも用意されている。

  VERBOSE ... Log.v()
  DEBUG ... Log.d()
  INFO ... Log.i()
  WARN ... Log.w()
  ERROR ... Log.e()

ウィンドウの右上にある(V)(D)(I)(W)(E)ボタンで表示するログの種別を切り替えることも出来る。
Androidアプリ紹介
リリース中のアプリはまだありません。
iPhoneアプリ紹介
タイピング革命
フリック入力はタイピング革命で練習しよう!ネットランキングがウリのタイピングアプリ

icon-l-typing.jpg

初心者も安心のトレーニングモード搭載!リプレイ機能でオンラインランキング上の達人のプレイを見てみよう!



簡単3Dカメラ
iPhoneで手軽に3D写真を楽しもう!平行法/交差法/アナグリフ/グラグラ3Dに対応。
icon-l-3d.jpg

2枚の写真を撮影するだけで、裸眼で立体視できる3D写真が作成できます。平行法、交差法、アナグリフ、グラグラ3Dと多彩なモードを搭載。85円でこの機能を体感できるのは簡単3Dカメラだけ!

プロフィール

あらきんぐ★

Author:あらきんぐ★
FC2ブログへようこそ!

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
アクセスカウンター
アクセスランキング
[ジャンルランキング]
携帯電話・PHS
310位
アクセスランキングを見る>>

[サブジャンルランキング]
Android(Google)
77位
アクセスランキングを見る>>
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。