スポンサーサイト

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

画面起動時にソフトキーボードを自動的に表示する方法

画面を開いた時にソフトキーボードを開く方法をWEBで調べてみたところ、結構多くのサイトでやり方が紹介されていた。
しかし、実際にやってみると上手くいかないやり方が多く、思った以上に苦労した。WEBの情報でも、エミュレータでは上手くいくけど実機ではダメとか、その逆も。更には、機種によってうまくいかないとか・・・。どうやら機種依存がありそうな雰囲気。

私の所有しているEVO WiMAXとminipad-s(中華Pad)では、下のやり方でソフトキーボードを表示することに成功した。

まず、Activityが表示されたタイミングで、EditTextコントロールにフォーカスを与える。


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

        // フォーカスをセット
        editText.requestFocus();
     }


次に、EditTextコントロールがフォーカスを受けた時の処理を追加する。ここでソフトキーを表示するコードを書けば実現できそうな気がするが、残念ながらそれでは無理だった。フォーカスイベントから抜けた後にコードを書けばうまくいくことが分かったので、ソフトキーを表示する処理を遅延呼び出しすることに。


    // ウィンドウのフォーカス変更イベント
    public void onWindowFocusChanged(boolean hasFocus) {
        super.onWindowFocusChanged(hasFocus);

        // EditTextのインスタンスを取得
        EditText editText = (EditText)findViewById(R.id.dmyText);
       
        // EditTextがフォーカスを取得した場合
        if(hasFocus && editText == getCurrentFocus()) {
            new Handler().postDelayed( showKeyboardDelay , 10);
        }
    }


そして最後に、上記のコードでPOSTされるメソッドを実装する。


    // ソフトキーボード表示の遅延実行処理
    private final Runnable showKeyboardDelay = new Runnable() {
        @Override
        public void run() {
            EditText editText = (EditText)findViewById(R.id.dmyText);
            // ソフトキーボードを表示
            InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.showSoftInput(editText, 0);
        }
    };


10msecとしているが、どのぐらいの時間が妥当なのかは良く分からない。1msecでも問題ないのか、タイミングや機種によってダメなのか・・・。まぁ、もう少し値を調整しながら検証してみようと思う。(試した方は情報をいただけるとありがたいです)

予断だが、iPhoneの場合は↓のような感じで対応した。
キーボードを自動的に表示する方法 - あらきんぐのiPhoneアプリ開発ブログ

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

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

Androidアプリ紹介
リリース中のアプリはまだありません。
iPhoneアプリ紹介
タイピング革命
フリック入力はタイピング革命で練習しよう!ネットランキングがウリのタイピングアプリ

icon-l-typing.jpg

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



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

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

プロフィール

あらきんぐ★

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

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

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

この人とブロともになる

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