Reputation: 885
I have an android DialogFragment that displays a ListView, each row containing a title and image. Everything displays fine until I remove the title from the DialogFragment with getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE);
Once I remove the title, the images stop displaying in the ListView and all that displays are the titles. How could FEATURE_NO_TITLE possibly affect the display of the ListView within the DialogFragment? Literally no other lines of code change - just that one, and the images stop displaying in the ListView.
Dialog Fragment OnCreate
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.pick_photo_dialog_fragment, container);
getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE);
Button closeButton = (Button) view.findViewById(R.id.closeButton);
closeButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
dismiss();
}
});
listview = (ListView) view.findViewById(R.id.photosListView);
listadapter = new PhotoListAdapter(getActivity());
listview.setAdapter(listadapter);
listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> a, View v, int position, long id) {
//do stuff
}
});
return view;
}
XML for the fragment contains nothing more than a ListView and Button inside a LinearLayout...
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="@color/dark_gray">
<ListView android:id="@+id/photosListView"
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:clickable="false"
android:listSelector="@android:color/transparent"
android:cacheColorHint="@android:color/transparent"
/>
<Button android:id="@+id/closeButton"
android:layout_width="100dp"
android:layout_height="40dp"
android:layout_gravity="center"
android:text="Close"
android:textSize="20dp"
android:textStyle="bold"
android:textColor="@color/white"
android:typeface="sans"
android:background="@color/transparent"/>
</LinearLayout>
ListAdapter relevant classes
int[] mResources = {R.drawable.basketball, R.drawable.bodyweight, R.drawable.boulder, R.drawable.boxing, R.drawable.cardio,
R.drawable.crossfit, R.drawable.olympic, R.drawable.racquet, R.drawable.run, R.drawable.spin, R.drawable.squash,
R.drawable.swim, R.drawable.volleyball, R.drawable.weight, R.drawable.yoga};
String[] pictureNames = {"basketball", "bodyweight", "boulder", "boxing", "cardio", "crossfit", "olympic", "racquet", "run",
"spin", "squash", "swim", "volleyball", "weight", "yoga"};
public PhotoListAdapter(Context context) {
mInflater = LayoutInflater.from(context);
mContext = context;
}
public int getCount() {
return mResources.length;
}
public Object getItem(int position) {
return pictureNames[position];
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.photo_list_row_view, null);
holder = new ViewHolder();
holder.activityNameTV = (TextView) convertView.findViewById(R.id.activityName);
holder.activityImageIV = (ImageView) convertView.findViewById(R.id.activityImage);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
task = new CreateClassSetImageTask(position, holder.activityNameTV, holder.activityImageIV);
task.execute();
return convertView;
}
static class ViewHolder {
TextView activityNameTV;
ImageView activityImageIV;
}
XML for ListView row
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/mainlayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView android:id="@+id/activityName"
android:layout_width="110dp"
android:layout_height="wrap_content"
android:text=""
android:textSize="20dp"
android:textStyle="normal"
android:textColor="#FFFFFF"
android:typeface="sans"
android:layout_gravity="left|center_vertical"
/>
<ImageView android:id="@+id/activityImage"
android:layout_width="0dp"
android:layout_height="100dp"
android:layout_weight="1"
android:scaleType="centerInside"/>
</LinearLayout>
Async Task to Load Images
public class CreateClassSetImageTask extends AsyncTask<Void, Void, Bitmap> {
WeakReference<ImageView> imageViewReference;
WeakReference<TextView> textViewReference;
int pictureNum;
public CreateClassSetImageTask(int pictureNumIn, TextView activityNameTVIn, ImageView activityIVIn) {
pictureNum = pictureNumIn;
imageViewReference = new WeakReference<ImageView>(activityIVIn);
textViewReference = new WeakReference<TextView>(activityNameTVIn);
}
@Override
protected void onPreExecute() {
}
@Override
protected void onPostExecute(Bitmap resultBitmap) {
if (imageViewReference != null && resultBitmap != null && textViewReference != null) {
final ImageView imageView = imageViewReference.get();
if (imageView != null) {
imageView.setImageBitmap(resultBitmap);
}
final TextView textView = textViewReference.get();
if (textView != null){
textView.setText(pictureNames[pictureNum]);
}
}
}
@Override
protected Bitmap doInBackground(Void... params) {
return decodeSampledBitmapFromResource(mContext.getResources(), mResources[pictureNum], 100, 100);
}
}
public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId,
int reqWidth, int reqHeight) {
// First decode with inJustDecodeBounds=true to check dimensions
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeResource(res, resId, options);
// Calculate inSampleSize
options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);
// Decode bitmap with inSampleSize set
options.inJustDecodeBounds = false;
return BitmapFactory.decodeResource(res, resId, options);
}
public static int calculateInSampleSize(
BitmapFactory.Options options, int reqWidth, int reqHeight) {
// Raw height and width of image
final int height = options.outHeight;
final int width = options.outWidth;
int inSampleSize = 1;
if (height > reqHeight || width > reqWidth) {
final int halfHeight = height / 2;
final int halfWidth = width / 2;
// Calculate the largest inSampleSize value that is a power of 2 and keeps both
// height and width larger than the requested height and width.
while ((halfHeight / inSampleSize) > reqHeight
&& (halfWidth / inSampleSize) > reqWidth) {
inSampleSize *= 2;
}
}
return inSampleSize;
}
Upvotes: 1
Views: 247
Reputation: 26
Try this...instead of using getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE);
Set DialogFragment.STYLE_NO_TITLE
in the onCreate method of the Dialog like this:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mNum = getArguments().getInt("num");
style = DialogFragment.STYLE_NO_TITLE; break;
theme = android.R.style.Theme_Holo; break;
setStyle(style, theme);
}
Upvotes: 1
Reputation: 4147
Here you can find the whole code for your dialog. Basically I removed the AsyncTask (you can eventually restore it if you need for example to download pictures from network) and override method onCreateDialog
instead of onCreateView
.
public class PhotoDialog extends DialogFragment {
public static PhotoDialog newInstance() {
return new PhotoDialog();
}
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
View v = getActivity().getLayoutInflater().inflate(R.layout.pick_photo_dialog_fragment, null);
Button closeButton = (Button) v.findViewById(R.id.closeButton);
closeButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
dismiss();
}
});
ListView listView = (ListView) v.findViewById(R.id.photosListView);
ListAdapter listAdapter = new PhotoListAdapter(getActivity());
listView.setAdapter(listAdapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> a, View v, int position, long id) {
//do stuff
}
});
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
// REMOVE setTitle in case you don't want dialog title to be shown
//builder.setTitle("Dialog Title");
builder.setView(v);
return builder.create();
}
private static class PhotoListAdapter extends BaseAdapter {
private static ListItem[] _ITEMS = {
new ListItem("basketball", R.drawable.basketball),
new ListItem("bodyweight", R.drawable.bodyweight),
new ListItem("boulder", R.drawable.boulder),
new ListItem("boxing", R.drawable.boxing),
new ListItem("cardio", R.drawable.cardio),
new ListItem("crossfit", R.drawable.crossfit),
new ListItem("olympic", R.drawable.olympic),
new ListItem("racquet", R.drawable.racquet),
new ListItem("run", R.drawable.run),
new ListItem("spin", R.drawable.spin),
new ListItem("squash", R.drawable.squash),
new ListItem("swim", R.drawable.swim),
new ListItem("volleyball", R.drawable.volleyball),
new ListItem("weight", R.drawable.weight),
new ListItem("yoga", R.drawable.yoga)
};
static class ViewHolder {
TextView activityNameTV;
ImageView activityImageIV;
}
static class ListItem {
String title;
int icon;
public ListItem(String title, int icon) {
this.title = title;
this.icon = icon;
}
}
private LayoutInflater mInflater;
public PhotoListAdapter(Context context) {
mInflater = LayoutInflater.from(context);
}
public int getCount() {
return _ITEMS.length;
}
public Object getItem(int position) {
return _ITEMS[position];
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.photo_list_row_view, null);
holder = new ViewHolder();
holder.activityNameTV = (TextView) convertView.findViewById(R.id.activityName);
holder.activityImageIV = (ImageView) convertView.findViewById(R.id.activityImage);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
ListItem item = (ListItem) getItem(position);
holder.activityNameTV.setText(item.title);
holder.activityImageIV.setImageResource(item.icon);
return convertView;
}
}
}
Upvotes: 0