新的DialogInterface.OnClickListener在片段中不起作用

时间:2016-02-21 11:56:41

标签: android android-fragments alertdialog android-context

我有AppCompatActivity fragment。在fragment内,我有一个ImageButton。点击该按钮,我想在系统中显示dialog所有必需的IntentsFragment相关代码:

avatar.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                showPhotoUploadDialog();
            }
        });

private void showPhotoUploadDialog(){
            ImagePickUpUtil.openMediaSelector(this.getActivity());
        }

ImagePickUpUtil是来自Felix Garcia Borrego 的静态类:

import android.app.Activity;
import android.app.AlertDialog;
import android.content.ComponentName;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;


import java.util.ArrayList;
import java.util.List;


public class ImagePickUpUtil {

    /**
     * Detect the available intent and open a new dialog.
     *
     * @param context
     */
    public static void openMediaSelector(Activity context) {

        Intent camIntent = new Intent("android.media.action.IMAGE_CAPTURE");
        Intent gallIntent = new Intent(Intent.ACTION_GET_CONTENT);
        gallIntent.setType("image/*");

        // look for available intents
        List<ResolveInfo> info = new ArrayList<>();
        List<Intent> yourIntentsList = new ArrayList<>();
        PackageManager packageManager = context.getPackageManager();
        List<ResolveInfo> listCam = packageManager.queryIntentActivities(camIntent, 0);
        for (ResolveInfo res : listCam) {
            final Intent finalIntent = new Intent(camIntent);
            finalIntent.setComponent(new ComponentName(res.activityInfo.packageName, res.activityInfo.name));
            yourIntentsList.add(finalIntent);
            info.add(res);
        }
        List<ResolveInfo> listGall = packageManager.queryIntentActivities(gallIntent, 0);
        for (ResolveInfo res : listGall) {
            final Intent finalIntent = new Intent(gallIntent);
            finalIntent.setComponent(new ComponentName(res.activityInfo.packageName, res.activityInfo.name));
            yourIntentsList.add(finalIntent);
            info.add(res);
        }

        // show available intents
        openDialog(context, yourIntentsList, info);
    }

    /**
     * Open a new dialog with the detected items.
     */
    private static void openDialog(final Activity context, final List<Intent> intents, List<ResolveInfo> activitiesInfo) {
        AlertDialog.Builder dialog = new AlertDialog.Builder(context);
        dialog.setTitle(context.getString(R.string.choose_action));
        ArrayAdapter arrayAdapter = buildAdapter(context, activitiesInfo);
        dialog.setAdapter(arrayAdapter, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int id) {
                        System.out.println("clicked on " + id);
                        Intent intent = intents.get(id);
                        context.startActivityForResult(intent, 1);

                    }
                });

        dialog.setNeutralButton(context.getResources().getString(R.string.cancel),
                new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.dismiss();
                    }
                });
        dialog.show();
    }


    /**
     * Build the list of items to show using the intent_listview_row layout.
     *
     * @param context
     * @param activitiesInfo
     * @return
     */
    private static ArrayAdapter<ResolveInfo> buildAdapter(final Context context, final List<ResolveInfo> activitiesInfo) {
        return new ArrayAdapter<ResolveInfo>(context, R.layout.view_contact_details_row, R.id.contact_details_label, activitiesInfo) {
            @Override
            public View getView(int position, View convertView, ViewGroup parent) {
                View view = super.getView(position, convertView, parent);
                ResolveInfo res = activitiesInfo.get(position);

                TextView textview = (TextView) view.findViewById(R.id.contact_details_label);
                textview.setText(res.loadLabel(context.getPackageManager()).toString());
                return view;
            }
        };
    }
}

一切正常,直到我尝试点击ListItem中的Dialog,虽然NegativeButton工作正常,但所有列表商品点击都不会触发。我建议它与传递给静态类的context有关,但我半天都无法解决这个问题。谢谢。

1 个答案:

答案 0 :(得分:0)

找到了解决方案here。这是布局的问题。添加android:descendantFocusability="blocksDescendants" 解决了这个问题。