Мягкая клавиатура не отображается при использовании адаптера в DialogFragment

У меня есть собственный DialogFragment, в котором есть ArrayAdapter, в котором есть несколько editTexts. Когда отображается диалоговое окно, программная клавиатура не появляется, даже если я нажимаю на текст редактирования. Текст редактирования действительно фокусируется, но клавиатура никогда не появляется.

Если я не использую адаптер, а просто использую представление с текстом редактирования, он работает отлично, но как только я добавляю адаптер, я получаю проблему.

Мой код ниже. Любая помощь могла бы быть полезна.

Заранее спасибо.

public class ParameterDialog extends DialogFragment {
Context context;

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {

    ArrayList<Parameter> params = this.getArguments().getParcelableArrayList(MainActivity.KEY_PARAMS_TO_DIALOG);
    String name = this.getArguments().getString(MainActivity.KEY_NAME_TO_DIALOG);

    context = getActivity();
    // Use the Builder class for convenient dialog construction
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());

    ParameterDialogAdapter pda = new ParameterDialogAdapter(context,R.layout.parameter_config_string , params);

    // Inflate and set the layout for the dialog
    // Pass null as the parent view because its going in the dialog layout
    builder
            .setTitle(name)
            .setAdapter(pda,null)
            .setPositiveButton("Send", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {
                }
            })
            .setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {
                }
            });

    // Create the AlertDialog object and return it
    return builder.create();
}}

-

public class ParameterDialogAdapter extends ArrayAdapter<Parameter> {

Context context;
int layoutResourceId;
ArrayList<Parameter> data= null;

public ParameterDialogAdapter(Context context, int layoutResourceId, ArrayList<Parameter> data) {
    super(context, layoutResourceId, data);
    this.layoutResourceId = layoutResourceId;
    this.context = context;
    this.data = data;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    View row = convertView;
    //ParameterHolder holder = null;
    final LayoutInflater inflater = ((Activity)context).getLayoutInflater();
    final int p =position;
    row = inflater.inflate(layoutResourceId, parent, false);
    return row;
}}

-Макет

<LinearLayout
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/paramValueHolder"
android:paddingRight="10dp"
android:paddingLeft="10dp"
android:paddingBottom="5dp">

<EditText
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:id="@+id/paramValue"
    android:hint="Value"
    android:textColor="@color/text_grey" />

-Code to Show Dialog

ParameterDialog pDialog = new ParameterDialog ();

        Bundle bundle = new Bundle();
        bundle.putString(KEY_NAME_TO_DIALOG,action.getName());
        bundle.putParcelableArrayList(KEY_PARAMS_TO_DIALOG, params);
        pDialog.setArguments(bundle);

        pDialog.setArguments(bundle);
        pDialog.show(ft, "parameter_dialog");

person boozelclark    schedule 21.01.2014    source источник
comment
обязательно ли использовать переходник? - см. stackoverflow.com/questions/12876624/   -  person Daniel Bo    schedule 21.01.2014
comment
Привет, к сожалению, да. Выше приведен упрощенный пример, демонстрирующий мою проблему. Мой фактический код более сложен, и адаптер кажется лучшим способом сделать это. Если ничего не поможет, я думаю, мне придется удалить его.   -  person boozelclark    schedule 21.01.2014


Ответы (2)


Я столкнулся с подобной проблемой при использовании FragmentDialog, содержащего ListView. Элементы в ListView содержали EditText виджетов, которые не вызывали программную клавиатуру.

Обходной путь, который я обнаружил, заключался в том, чтобы поместить невидимый EditText в корневой макет файла FragmentDialog.

Например:

list_layout.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ListView
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:id="@android:id/list"/>

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:visibility="gone" />
</LinearLayout>

DialogFragment создает представления следующим образом:

@Override
public Dialog onCreateDialog(Bundle savedInstanceState)
{
    LayoutInflater inflater = getActivity().getLayoutInflater();
    View listLayout = inflater.inflate(R.layout.list_layout, null);
    mListView = (ListView) listLayout.findViewById(android.R.id.list);
    return new AlertDialog.Builder(getActivity()).setView(listLayout).create();
}

@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState)
{
    super.onActivityCreated(savedInstanceState);
    //set adapter
    mListView.setAdapter(mListAdapter);
}

Надеюсь это поможет

person Gary McGowan    schedule 16.10.2014
comment
какая логика стоит за этим? - person Preetam; 04.03.2016
comment
он работает нормально - person Saljith Kj; 17.03.2021
comment
Это сработало, но в чем логика этого, я до сих пор не могу понять. - person Avinash Kumar Singh; 19.04.2021
comment
Магия может работать какое-то время, но однажды она не сработает, и вы просто отложите проблему. - person The incredible Jan; 29.06.2021

установите свойство потомков блока для вашего файла list_item_layout. Надеюсь, это поможет

person Imtiyaz Khalani    schedule 21.01.2014
comment
Спасибо, я добавил android:descendantFocusability=blocksDescendants в корневой линейный макет, но это по-прежнему не вызывает клавиатуру и не позволяет мне сосредоточиться на тексте редактирования. - person boozelclark; 21.01.2014