使用 putExtra 将视图 ID 传递给 onActivityResult 不起作用
passing view id to onActivityResult with putExtra does not work
我根据来自 api 的字段类型将视图动态添加到 LinearLayout。
如果字段类型要求 'image' 我创建一个图像选择按钮并将其添加到视图中。
我还创建了一个图像视图,因此当调用 onActivityResult 时,我可以将选择的图像分配给该图像视图。
但是,
要找到动态创建的图像视图,我需要传递某种标识符。
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- 和 setTag 可能也是一个解决方案..但我仍然需要以某种方式传递它。
好的,现在我得到照片了;)
你不能传递自定义的额外参数,嗯..你可以,但是被调用的 activity 不会使用它。当 return 给调用者时,它将只发送 activity 的可用额外结果...
如果您在 Manifest 中将 Activity 设置为 SingleInstance,则不会根据结果重新创建它,因此您可以添加 public class 变量 "public static int referImage = 0" 并设置它在带有点击 ID 的按钮上点击。然后,当您得到结果时,您将在该变量上获得图像 ID 引用。
btn.setOnClickListener(new View.OnClickListener() {
public void onClick(View arg0) {
referImage = tmpviewid;
....
我不确定此解决方案是否有效,但无法通过这种方式检索自定义 Extra。
告诉我,我会想办法。
示例:
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;
}
当用户点击 Button 时,它会设置 referImage = tmpviewid;
当 Activity 返回结果时,referImage 的最后一个值将是用户单击的按钮。
在Activity结果你只需要读取referImage值。
我根据来自 api 的字段类型将视图动态添加到 LinearLayout。
如果字段类型要求 'image' 我创建一个图像选择按钮并将其添加到视图中。
我还创建了一个图像视图,因此当调用 onActivityResult 时,我可以将选择的图像分配给该图像视图。
但是, 要找到动态创建的图像视图,我需要传递某种标识符。
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- 和 setTag 可能也是一个解决方案..但我仍然需要以某种方式传递它。
好的,现在我得到照片了;)
你不能传递自定义的额外参数,嗯..你可以,但是被调用的 activity 不会使用它。当 return 给调用者时,它将只发送 activity 的可用额外结果...
如果您在 Manifest 中将 Activity 设置为 SingleInstance,则不会根据结果重新创建它,因此您可以添加 public class 变量 "public static int referImage = 0" 并设置它在带有点击 ID 的按钮上点击。然后,当您得到结果时,您将在该变量上获得图像 ID 引用。
btn.setOnClickListener(new View.OnClickListener() {
public void onClick(View arg0) {
referImage = tmpviewid;
....
我不确定此解决方案是否有效,但无法通过这种方式检索自定义 Extra。
告诉我,我会想办法。
示例:
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;
}
当用户点击 Button 时,它会设置 referImage = tmpviewid;
当 Activity 返回结果时,referImage 的最后一个值将是用户单击的按钮。
在Activity结果你只需要读取referImage值。