我有AppCompatActivity
fragment
。在fragment
内,我有一个ImageButton
。点击该按钮,我想在系统中显示dialog
所有必需的Intents
。 Fragment
相关代码:
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
有关,但我半天都无法解决这个问题。谢谢。
答案 0 :(得分:0)
找到了解决方案here。这是布局的问题。添加android:descendantFocusability="blocksDescendants"
解决了这个问题。