c# - 指定的子项已经有父项。您必须首先对子级的父级调用removeView()。 (C#)

标签 c# android view xamarin

我已经看到了很多类似的问题,但到目前为止,我所看到的所有问题都没有帮助我解决问题(主要是因为它是用 Java 编写的,而我使用的是 C#)。

protected override void OnCreate(Bundle bundle)
{
    base.OnCreate(bundle);
    SetContentView(Resource.Layout.MainV2);

    if (IsThereAnAppToTakePictures())
    {
        CreateDirectoryForPictures();
        btnAdd = FindViewById<Button>(Resource.Id.btnAdd);
        btnAdd.Click += DialogAddPhoto;
    }

    myFileListAdapter = new ArrayAdapter(this, Resource.Drawable.style_listview);
    listViewFiles = FindViewById<ListView>(Resource.Id.listView1);
}

private void DialogAddPhoto(object sender, EventArgs eventArgs)
{
    // passing intent i.e. REQUEST_CAMERA, SELECT_FILE
}

我在哪里遇到问题...

protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
{
    base.OnActivityResult(requestCode, resultCode, data);
    _imageView = new ImageView(this);
    btnRemove = FindViewById<Button>(Resource.Id.btnRemove);

    if (resultCode == Result.Ok)
    {
        if (requestCode == REQUEST_CAMERA)
        {
            // ................. //
        }
        else if ((requestCode == SELECT_FILE) && (data != null))
        {
            Android.Net.Uri uri = data.Data;
            string imgUri = Convert.ToString(uri);

            string[] proj = { MediaStore.Images.ImageColumns.Data };
            var cursor = ContentResolver.Query(uri, proj, null, null, null);
            var colIndex = cursor.GetColumnIndex(MediaStore.Images.ImageColumns.Data);
            cursor.MoveToFirst();
            BitmapFactory.Options options = new BitmapFactory.Options { InJustDecodeBounds = true };
            BitmapFactory.DecodeFile(cursor.GetString(colIndex), options);
            int height = 300;
            int width = Resources.DisplayMetrics.WidthPixels;
            int outHeight = options.OutHeight;
            int outWidth = options.OutWidth;
            int inSampleSize = 1;

            if (outHeight > height || outWidth > width)
                {
                    inSampleSize = outWidth > outHeight
                                       ? outHeight / height
                                       : outWidth / width;
                }

             options.InSampleSize = inSampleSize;
             options.InJustDecodeBounds = false;
             App.bm = BitmapFactory.DecodeFile(cursor.GetString(colIndex), options);
             System.IO.MemoryStream mem = new System.IO.MemoryStream();
             App.bm.Compress(Bitmap.CompressFormat.Png, 100, mem);
             //byte[] byteArray = mem.ToArray();
             _imageView.SetImageBitmap(App.bm);
             App.bm = null;
             GC.Collect();

             myFileListAdapter.Add(imgUri);
             myFileListAdapter.NotifyDataSetChanged();
             setListViewHeightBasedOnChildren(listViewFiles);

             listViewFiles.ItemClick += (object sender, ItemClickEventArgs e) =>
             {
                 AlertDialog.Builder builder = new AlertDialog.Builder(this);
                 builder.SetTitle("Preview");                        
                 builder.SetView(_imageView);
                 builder.SetCancelable(false);
                 builder.SetPositiveButton("Cancel", (senderAlert, args) => { });
                 builder.SetNegativeButton("Delete?", (senderAlert, args) =>
                 {

                     Java.Lang.Object toRemove = myFileListAdapter.GetItem(e.Position);
                     myFileListAdapter.Remove(toRemove);
                     myFileListAdapter.NotifyDataSetChanged();
                     setListViewHeightBasedOnChildren(listViewFiles);

                 });

                 builder.Show();
                };

            }
        }
    }

这就是罪魁祸首。

builder.SetView(_imageView);

我尝试这样做,但仍然遇到同样的错误。

builder.SetView(null);
builder.SetView(_imageView);

它的作用是从图库中选择或添加图像后,将 Uri 添加到列表 (ListView)。单击该项目后,会在看到图像 (_imageView) 的位置出现一个警报对话框。在从图库中删除并添加另一张图片后,单击取消并查看Uri图像后,会发生错误。

我见过的所有解决方案都使用 Inflate,老实说,我不知道如何将其合并到我的代码中,因为 ImageView 取决于动态值(从图库导入的图像)。

请注意,我使用的是 Xamarin Android。

追踪:

06-27 17:51:54.434 E/mono-rt (16678): java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
06-27 17:51:54.434 E/mono-rt (16678):   at android.view.ViewGroup.addViewInner(ViewGroup.java:3430)
06-27 17:51:54.434 E/mono-rt (16678):   at android.view.ViewGroup.addView(ViewGroup.java:3301)
06-27 17:51:54.434 E/mono-rt (16678):   at android.view.ViewGroup.addView(ViewGroup.java:3277)
06-27 17:51:54.434 E/mono-rt (16678):   at com.android.internal.app.AlertController.setupView(AlertController.java:416)
06-27 17:51:54.434 E/mono-rt (16678):   at com.android.internal.app.AlertController.installContent(AlertController.java:244)
06-27 17:51:54.434 E/mono-rt (16678):   at android.app.AlertDialog.onCreate(AlertDialog.java:337)
06-27 17:51:54.434 E/mono-rt (16678):   at android.app.Dialog.dispatchOnCreate(Dialog.java:355)
06-27 17:51:54.434 E/mono-rt (16678):   at android.app.Dialog.show(Dialog.java:260)
06-27 17:51:54.434 E/mono-rt (16678):   at android.app.AlertDialog$Builder.show(AlertDialog.java:951)
06-27 17:51:54.434 E/mono-rt (16678):   at mono.android.widget.AdapterView_OnItemClickListenerImplementor.n_onItemClick(Native Method)
06-27 17:51:54.434 E/mono-rt (16678):   at mono.android.widget.AdapterView_OnItemClickListenerImplementor.onItemClick(AdapterView_OnItemClickListenerImplementor.java:29)
06-27 17:51:54.434 E/mono-rt (16678):   at android.widget.AdapterView.performItemClick(AdapterView.java:298)
06-27 17:51:54.434 E/mono-rt (16678):   at android.widget.AbsListView.performItemClick(AbsListView.java:1128)
06-27 17:51:54.434 E/mono-rt (16678):   at android.widget.AbsListView$PerformClick.run(AbsListView.java:2815)
06-27 17:51:54.434 E/mono-rt (16678):   at android.widget.AbsListView$1.run(AbsListView.java:3574)
06-27 17:51:54.434 E/mono-rt (16678):   at android.os.Handler.handleCallback(Handler.java:800)
06-27 17:51:54.434 E/mono-rt (16678):   at android.os.Handler.dispatchMessage(Handler.java:100)
06-27 17:51:54.434 E/mono-rt (16678):   at android.os.Looper.loop(Looper.java:194)
06-27 17:51:54.434 E/mono-rt (16678):   at android.app.ActivityThread.main(ActivityThread.java:5371)
06-27 17:51:54.434 E/mono-rt (16678):   at java.lang.reflect.Method.invokeNative(Native Method)
06-27 17:51:54.434 E/mono-rt (16678):   at java.lang.reflect.Method.invoke(Method.java:525)
06-27 17:51:54.434 E/mono-rt (16678):   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833)
06-27 17:51:54.434 E/mono-rt (16678):   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
06-27 17:51:54.434 E/mono-rt (16678):   at dalvik.system.NativeStart.main(Native Method)

最佳答案

ImageView 已分配给父级,创建一个新的 ImageView 并设置它

  AlertDialog.Builder builder = new AlertDialog.Builder(this);
                 builder.SetTitle("Preview");  
 var temp= new ImageView(this);   
temp.SetImageBitmap(App.bm);                   
                 builder.SetView(temp);
                 builder.SetCancelable(false);
                 builder.SetPositiveButton("Cancel", (senderAlert, args) => { });
                 builder.SetNegativeButton("Delete?", (senderAlert, args) =>
                 {

                     Java.Lang.Object toRemove = myFileListAdapter.GetItem(e.Position);
                     myFileListAdapter.Remove(toRemove);
                     myFileListAdapter.NotifyDataSetChanged();
                     setListViewHeightBasedOnChildren(listViewFiles);

                 });

                 builder.Show();
                };

关于c# - 指定的子项已经有父项。您必须首先对子级的父级调用removeView()。 (C#),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38051508/

相关文章:

ruby-on-rails - Rails 复杂 View 表单与 has_many :through association

c# - C#代码中的美元符号是什么意思?

c# - 使用 FieldInfo.SetValue 与 LINQ 表达式在结构中设置字段

c# - 在 Windows 服务中使用 ConfigureAwait(false)?

java - 无法从android接收php中的post参数?

android - 修改 Android 内核交换

c# - 进程 ID 未出现在 log4net 日志文件名中

android - 检测用户是否完成 ACTION_SEND Intent 而不是按回?

ios - Swift-如何将选项卡栏和导航栏添加到单个 View Controller ?

visual-studio-2010 - 在 SharePoint 2010 列表定义中隐藏 View 的文件夹结构