如何在自定义列表视图中捕获和显示图像

时间:2017-05-02 06:14:12

标签: android image android-intent bitmap capture

我有一个自定义列表视图,其中包含textview,checkbox和imageview。如果选中复选框,则会显示textview和imageview。当我单击textView时,我拍摄照片并在imageview中显示。因为我无法在适配器中调用onActivityResult,所以我在Activity中调用它,我想在listView中将对象的位置从适配器发送到activity,但它发送的错误是我在MainActivity中收到的位置为null。那么,我该如何解决这个问题?

这是我的.xml文件

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/item_root"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="2dp"
android:paddingBottom="2dp"
android:paddingRight="10dp"
android:paddingLeft="16dp"
android:orientation="horizontal">


<TextView
    android:id="@+id/tv_instore"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:fontFamily="sans-serif"
    android:layout_centerVertical="true"
    android:text="Product"
    android:textSize="14sp"
    android:layout_weight="1"/>
<CheckBox
    android:id="@+id/chk_instore"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center_horizontal"
    android:layout_weight="1"
    android:checked="false"/>
<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    android:orientation="horizontal"
    android:paddingTop="5dp">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="Capture"
        android:visibility="invisible"
        android:id="@+id/txtCapture"/>
    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/img1"
        android:layout_weight="1"
        android:paddingTop="5dp"
        android:visibility="invisible"/>
</LinearLayout>

这是适配器:

txtCapture.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (mContext.getPackageManager().hasSystemFeature(
                PackageManager.FEATURE_CAMERA)) {
               Intent i = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
               i.putExtra("position",position);
               ((Activity) mContext).startActivityForResult(i, 100);
            }
        }
});

这是我在MainActivity中的onActivityResult():

 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if(requestCode==100&&resultCode==RESULT_OK){
        Bitmap b = (Bitmap)data.getExtras().get("data");
        int position = (int)data.getExtras().get("position");
        POSMQty p = arrPOSMInstore.get(position); 
        p.setBitmap(b);
    }
}

2 个答案:

答案 0 :(得分:0)

您在活动结果中获得的意图与您在startActivityForResult()上传递的意图不同。这就是你没有获得职位的原因。

为此你可以保存活动中的位置并在onActivityResult()中使用它。

答案 1 :(得分:0)

问题是您发送打开相机活动的意图与您在活动结果中收到的意图完全不同。意图接收由Camera Activity创建,用于将图像数据发送到您的活动。

这是一个解决方案,你可以做到这一点。

在适配器中声明一个变量,点击位置

private int posClicked = -1;

并在你的

txtCapture.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (mContext.getPackageManager().hasSystemFeature(
                PackageManager.FEATURE_CAMERA)) {
               Intent i = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
              // i.putExtra("position",position);
              posClicked = position;
               ((Activity) mContext).startActivityForResult(i, 100);
            }
        }
});

然后在活动结果

之后在适配器中创建一个方法
public void afterActivityResult(Bitmap bmp,.. extra){
  //do the need full
}

在您的活动结果中

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if(requestCode==100&&resultCode==RESULT_OK){
        Bitmap b = (Bitmap)data.getExtras().get("data");
        int position = (int)data.getExtras().get("position");
        POSMQty p = arrPOSMInstore.get(position); 
        p.setBitmap(b);
        yourAdapter.afterActivityResult(...);

} }

您还可以为clickedPosition方法制作getter方法。

适配器中的

public int getClickedPosition(){
     return posClicked;
}

并像

一样使用它
adapter.getClickedPosition()

在您的活动中。