Dynamic 使用putExtra将视图id传递给onActivityResult无效

Dynamic 使用putExtra将视图id传递给onActivityResult无效,dynamic,view,onactivityresult,Dynamic,View,Onactivityresult,我根据从api提交的字段类型向LinearLayout动态添加视图 如果字段类型指示“图像”,我将创建一个图像选择按钮,并将其添加到视图中 我还创建了一个imageview,以便在调用onActivityResult时,可以将所选图像指定给该imageview 但是,, 为了找到动态创建的imageview,我需要传递某种标识符 不知何故,putExtra()函数没有传递id 初始变量: private static final int SELECT_SINGLE_PICTURE = 101;

我根据从api提交的字段类型向LinearLayout动态添加视图

如果字段类型指示“图像”,我将创建一个图像选择按钮,并将其添加到视图中

我还创建了一个imageview,以便在调用onActivityResult时,可以将所选图像指定给该imageview

但是,, 为了找到动态创建的imageview,我需要传递某种标识符

不知何故,putExtra()函数没有传递id

初始变量:

private static final int SELECT_SINGLE_PICTURE = 101;
public static final String IMAGE_TYPE = "image/*";
private ImageView selectedImagePreview;
protected int tmpviewid;
动态字段创建:

LinearLayout ll = (LinearLayout)findViewById(R.id.linearLayout2);
TextView tmltname = new TextView(NewJobActivity.this);
tmltname.setText(vwa.getName());
ll.addView(tmltname);

Iterator it = attributes.entrySet().iterator();
while (it.hasNext()) {
    if(val.getType().equals("image") ) {
        Button btn = new    Button(NewJobActivity.this);
        btn.setText(R.string.select_picture);
        ImageView iv = new ImageView(NewJobActivity.this);
        iv.setId(View.generateViewId());
        tmpviewid = iv.getId();

        btn.setOnClickListener(new View.OnClickListener() {
            public void onClick(View arg0) {
                Intent intent = new Intent();
                intent.setType(IMAGE_TYPE);
                intent.setAction(Intent.ACTION_GET_CONTENT);
                intent.putExtra("imageid",  tmpviewid);

                startActivityForResult( Intent.createChooser( intent, getString(R.string.select_picture)), SELECT_SINGLE_PICTURE );
            }
        });

        ll.addView(btn);
        ll.addView(iv);
}
onActivityResult:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == RESULT_OK) {
        if (requestCode == SELECT_SINGLE_PICTURE) {
            Uri selectedImageUri = data.getData();
            int myviewid = data.getIntExtra("myviewid",-1);
            Log.i("##MYLOG###", "###imageid:" + myviewid);
            try {
                Bitmap pic =  new  UserPicture(selectedImageUri, getContentResolver()).getBitmap();
                ImageView image = (ImageView) NewJobActivity.this.findViewById(myviewid);
                image.setImageBitmap(pic);
            }
图像选择正在工作,并且已填充selectedImageUri,但data.getIntExtra为什么不检索传递的myviewid?(它总是得到默认值-1,但tmpviewid确实得到了有效的id(1,2,3等等)

所有公认的解决方案都表明我的代码应该有效

也许还有别的事

或者我走错了方向


我在其他地方注意到get-and-setTag可能也是一个解决方案。。但是我仍然需要通过某种方式传递它。

好的,现在我明白了;)

您无法传递自定义的额外参数,嗯。。可以,但被调用的活动将不使用它。当返回到调用方时,它将只发送活动的可用附加结果

如果您在清单中将活动设置为SingleInstance,则不会在结果中重新创建它,因此您可以添加公共类变量“public static int refereImage=0”,并使用单击的ID将其设置为button click。然后,当您获得结果时,您将在此变量上具有图像ID引用

 btn.setOnClickListener(new View.OnClickListener() {
            public void onClick(View arg0) {
            referImage = tmpviewid;
            ....
我不确定此解决方案是否有效,但无法通过这种方式检索自定义额外值

让我知道,我会尝试另一种方法

例如:

public class myActivity extends Activity{
   public static int referImage = 0;

   ..... Override methods ..etc

   while (it.hasNext()) {
    if(val.getType().equals("image") ) {
      final int tmpviewid = iv.getId();

      ... more code
      btn.setOnClickListener(new View.OnClickListener() {
            public void onClick(View arg0) {
                referImage = tmpviewid;


}
当用户点击按钮时,它将设置referImage=tmpviewid

当“活动检索结果”时,用户将单击“引用图像”按钮的最后一个值


onActivityResult您只需读取refereImage值。

如何在onActivityResult中检索refereImageIn?另外,奇怪的是,如果我将按钮更改为textview,那么putExtra()函数就可以正常工作。是否不能将putExtra与button onclick一起使用?在任何方法之外的类声明public或private之后立即声明它,它将可以在整个类上下文中访问,包括onActivityResult,您可以将其用作声明的属性:)在启动活动之前设置,如果未重新创建活动,则返回之前设置的值时必须存在。但这意味着它将始终设置最后一个id。例如:api返回5个映像类型,然后“refereImage”变量将最终保留值5。(每次迭代都会为“refereimage”分配一个新id,覆盖以前的值)如果有人单击第二个“选择图像”按钮,我的值将是5而不是2,尽管有人为按钮2选择了一个图像,但图像将绑定到imageview 5。也许我没有抓住要点?在迭代过程中,您可以将var声明为final,每个按钮都将作为常量处理,而一旦单击操作,每个按钮都会有一个固定的值。final int tmpviewid=iv.getId();(在迭代中)并将refereimage声明为static int