2016-09-16 47 views
1

当我使用Myadapter单击动态创建的图像视图时,我想使用我的函数showImage(最后的Uri imageUri)将图像显示为全屏,某人提供解决方案。如何使用Myadapter通过动态创建的图像视图来显示图像到全屏

这是我的代码:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_mnt); 
    GridView gridView = (GridView)findViewById(R.id.gridview); 
    gridView.setAdapter(new MyAdapter(this)); 
} 

功能在全屏

public void showImage(final Uri imageUri) { 
    Dialog builder = new Dialog(Mnt.this); 
    builder.requestWindowFeature(Window.FEATURE_NO_TITLE); 
    builder.getWindow().setBackgroundDrawable(
      new ColorDrawable(Color.TRANSPARENT)); 
    builder.setOnDismissListener(new DialogInterface.OnDismissListener() { 
     @Override 
     public void onDismiss(DialogInterface dialogInterface) { 
      //nothing; 
     } 
    }); 

    ImageView imageView = new ImageView(Mnt.this); 
    imageView.setImageURI(imageUri); 
    builder.addContentView(imageView, new RelativeLayout.LayoutParams(
      ViewGroup.LayoutParams.WRAP_CONTENT, 
      ViewGroup.LayoutParams.WRAP_CONTENT)); 
    builder.show(); 
} 

MyAdapter.java显示图像

public final class MyAdapter extends BaseAdapter { 
private final List<Item> mItems = new ArrayList<Item>(); 
private final LayoutInflater mInflater; 

public MyAdapter(Context context) { 
    mInflater = LayoutInflater.from(context); 

    mItems.add(new Item("1",  R.drawable.m1)); 
    mItems.add(new Item("2", R.drawable.m2)); 
    mItems.add(new Item("3", R.drawable.m3)); 
    mItems.add(new Item("4",  R.drawable.m4)); 
    mItems.add(new Item("5",  R.drawable.m1)); 
    mItems.add(new Item("6",  R.drawable.m2)); 
} 

@Override 
public int getCount() { 
    return mItems.size(); 
} 

@Override 
public Item getItem(int i) { 
    return mItems.get(i); 
} 

@Override 
public long getItemId(int i) { 
    return mItems.get(i).drawableId; 
} 

@Override 
public View getView(int i, View view, ViewGroup viewGroup) { 
    View v = view; 
    ImageView picture; 
    TextView name; 

    if (v == null) { 
     v = mInflater.inflate(R.layout.grid_item, viewGroup, false); 
     v.setTag(R.id.picture, v.findViewById(R.id.picture)); 
     v.setTag(R.id.text, v.findViewById(R.id.text)); 
    } 

    picture = (ImageView) v.getTag(R.id.picture); 
    name = (TextView) v.getTag(R.id.text); 

    Item item = getItem(i); 

    picture.setImageResource(item.drawableId); 
    name.setText(item.name); 

    return v; 
} 

private static class Item { 
    public final String name; 
    public final int drawableId; 

    Item(String name, int drawableId) { 
     this.name = name; 
     this.drawableId = drawableId; 
    } 
} 

activity_mnt.xml

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

    <GridView 
     android:id="@+id/gridview" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:verticalSpacing="1dp" 
     android:horizontalSpacing="1dp" 
     android:stretchMode="columnWidth" 
     android:numColumns="2"/> 

</FrameLayout> 

SquareImageView.java

public class SquareImageView extends ImageView { 
public SquareImageView(Context context) { 
    super(context); 
} 

public SquareImageView(Context context, AttributeSet attrs) { 
    super(context, attrs); 
} 

public SquareImageView(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
} 

@Override 
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
    super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
    setMeasuredDimension(getMeasuredWidth(), getMeasuredWidth()); //Snap to width 
}} 
+0

问题是什么? –

+0

我没有想到调用我的函数showImage(uri) –

+0

为什么不修改它以传递int? –

回答

0

ViewGroup.LayoutParams.MATCH_PARENT,而不是ViewGroup.LayoutParams.WRAP_CONTENT 或者您对ImageView的不给的LayoutParams所以这就是为什么它仅在屏幕上显示图像的大小。 试试这个,让我知道。

+0

感谢您的回复,但我的问题不是关于WRAP_CONTENT或MATCH_PARENT。我想知道如何调用我的函数showImage(final Uri imageUri)? –

+0

你检查了第二行,你忘了给你的imageview对象的布局大小 –

0

为您的图像视图设置LayoutParam。

LayoutParams param = new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); 

imageView.setLayoutParams(param); 

问题是模糊的。但我认为你是这个意思。尝试一下,告诉我是否有问题。

首先,节省您的图片背景

public MyAdapter(Context context) { 
    this.context = context; 
    ... 
} 

然后setTag(drawableId),并把一个click事件。

@Override 
public View getView(int i, View view, ViewGroup viewGroup) { 
    View v = view; 
    ImageView picture; 
    TextView name; 

    if (v == null) { 
     v = mInflater.inflate(R.layout.grid_item, viewGroup, false); 
     v.setTag(R.id.picture, v.findViewById(R.id.picture)); 
     v.setTag(R.id.text, v.findViewById(R.id.text)); 
    } 

    picture = (ImageView) v.getTag(R.id.picture); 
    name = (TextView) v.getTag(R.id.text); 

    Item item = getItem(i); 

    picture.setImageResource(item.drawableId); 
    picture.setTag(item.drawableId); 
    name.setText(item.name); 

    picture.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      String imageID = v.getTag().toString(); 
      Uri uri = Uri.parse("android.resource://your.package.here/drawable/"+imageID); 
      ((ActivityNameHere) context).showImage(uri); 
     } 
    }); 

    return v; 
} 

希望有所帮助。

+0

感谢您的回复,但我的问题不是关于WRAP_CONTENT或MATCH_PARENT。我想知道如何调用我的函数showImage(final Uri imageUri)? –

+0

这不起作用 –

+0

错误或什么? –

0
gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      //call your showImage(final Uri imageUri) function with position/id 
     } 
    }); 
+0

谢谢,但如何从int或long变量传递Uri? –

+0

传递Uri不是一个好主意。我想说的是“K Neeraj Lal的”答案。 –

0

修改您的showImage方法以传递整数资源ID。

试试这个,

public void showImage(final int imageId) { 
    Dialog builder = new Dialog(this); 
    builder.requestWindowFeature(Window.FEATURE_NO_TITLE); 
    builder.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); 
    builder.setOnDismissListener(new DialogInterface.OnDismissListener() { 
     @Override 
     public void onDismiss(DialogInterface dialogInterface) { 
      //nothing; 
     } 
    }); 

    ImageView imageView = new ImageView(this); 
    imageView.setImageDrawable(ResourcesCompat.getDrawable(getResources(), imageId, getTheme())); 
    builder.addContentView(imageView, new RelativeLayout.LayoutParams(
      ViewGroup.LayoutParams.WRAP_CONTENT, 
      ViewGroup.LayoutParams.WRAP_CONTENT)); 
    builder.show(); 
} 

而不是建立在适配器内部的数据集,在您的活动创建它。在您的onCreate中按如下所示初始化数据集。

private final List<Item> mItems = new ArrayList<Item>(); 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_mnt); 

    mItems.add(new Item("1", R.drawable.m1)); 
    mItems.add(new Item("2", R.drawable.m2)); 
    mItems.add(new Item("3", R.drawable.m3)); 
    mItems.add(new Item("4", R.drawable.m4)); 
    mItems.add(new Item("5", R.drawable.m1)); 
    mItems.add(new Item("6", R.drawable.m2)); 

    GridView gridView = (GridView)findViewById(R.id.gridview); 
    gridView.setAdapter(new MyAdapter(this, mItems)); 

    gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 

     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      // Get your image id from your Item object 
      int imageId = mItems.get(position).getDrawable(); 
      showImage(imageId); 
     } 

    }); 
} 

还可以修改您的适配器的构造如下,

public MyAdapter(Context context, List<Item> dataset) { 
    mInflater = LayoutInflater.from(context); 
    this.mItems = dataset; 
}