2

バックグラウンド

フォームのようなアクティビティがあり、押すと動的に作成できるビューがいくつかあります。

ボタンをクリックすると膨らむ各フィールドにxmlを使用しています。

私が必要としているのは、新しいアイテムを追加することを選択すると、フォーカスを取得し、必要に応じてスクロールし、ユーザーが入力できるようにキーボードを表示することです。フィールドを追加するか、EditText をクリックすると、キーボードが表示される場合があります。

問題

何らかの理由で、一部のデバイスでは (Android バージョンの問題でさえないと思います)、新しいビューを膨らませると、その中の editText はフォーカスを取得できますが、フォーカスがあり、ユーザーはそれをクリックします。

このような場合、キーボードを表示する唯一の方法は、別の EditText をクリックすることです。

私はそれをテストしましたが、xml をまったく使用しない場合、つまりコードでのみビューを作成する場合には発生しないことに気付きました。

質問

なぜ発生するのですか?修正するにはどうすればよいですか?

私はすでに非常に多くの解決策を試しましたが、すべてのデバイスで機能するものはありません。

サンプルコード

次のコードには、xperia j (android 4.0.4) と galaxy mini (android 2.3.6) で説明されている問題があります。

@Override
protected void onCreate(final Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    final ViewGroup container = (ViewGroup) findViewById(R.id.LinearLayout1);
    final LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    findViewById(R.id.button).setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(final View v) {
            final View view = inflater.inflate(R.layout.field, null);
            // using the next code works when using it instead of inflating a layout:
            // final EditText editText = new EditText(MainActivity.this);
            // editText.setText("item " + container.getChildCount());
            container.addView(view);
        }
    });
}

フィールド レイアウト ファイル:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/RelativeLayout1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="#FFffffff"
    android:gravity="center_vertical" >

    <Spinner
        android:id="@+id/typeSpinner"
        android:layout_width="80dp"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_centerVertical="true"
        android:background="@null"
        android:padding="5dp" />

    <include
        android:id="@+id/removeItemView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_centerVertical="true"
        layout="@layout/remove_item_view" />

    <EditText
        android:id="@+id/fieldEditText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:layout_toLeftOf="@+id/removeItemView"
        android:layout_toRightOf="@+id/typeSpinner"
        android:ems="10"
        android:focusable="true"
        android:focusableInTouchMode="true"
        android:hint="field"
        android:imeOptions="actionDone"
        android:inputType="phone"
        android:minWidth="200dp"
        android:padding="5dp"
        android:singleLine="true"
        tools:ignore="HardcodedText" >
    <requestFocus />
    </EditText>

</RelativeLayout>

メイン レイアウト ファイル:

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/scrollView"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <LinearLayout
        android:id="@+id/LinearLayout1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <Button
            android:id="@+id/button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="click"
            tools:ignore="HardcodedText" />
    </LinearLayout>

</ScrollView>

EDIT:キーボードをすぐに表示しない部分的な解決策を見つけましたが、少なくともeditTextを押すと表示されます:

public static void forceFocusOnView(final View view) {
    if (view == null)
        return;
    view.post(new Runnable() {
        @Override
        public void run() {
            view.clearFocus();
            view.post(new Runnable() {
                @Override
                public void run() {
                    view.requestFocus();
                }
            });
        }
    });
}
4

1 に答える 1