使用位置更新LayoutInflator FrameLayout id

时间:2016-02-11 05:03:56

标签: android

我正在进行水平滚动,最初只有一个framelayout。在framelayout中,我有imageview和imagebutton。用户单击framelayout以从相机库添加图像。选择并加载图像后,它会使新的framelayout膨胀并向右添加新的framelayout(imageview和imagebutton)。目前,我允许用户最多加载5张图片。 ImageButton允许用户删除选定的framelayout。

每个虚增的framelayout都有id,我会继续跟踪它。我的问题如下:

当用户删除第一张图像时,我的第二张图像(framelayout)会替换但仍保持相同的ID。有没有办法用布局中的位置动态更改视图ID?

换句话说,如果我的framelayout位置根据用户操作更新(例如删除操作),那么我希望分配的ID也会更新。

图片加载和删除

 @Override
    public void onClick(View v) {
      if(v instanceof NetworkImageView) {
            clickedView = (NetworkImageView)v;
            showDialog(this);
      }
      else if(v instanceof ImageButton) {
            layout.removeViewAt(v.getId());
            totalImageCount--;
       }
   }

充气并添加新的FrameLayout

if (requestCode == 1 && resultCode == Activity.RESULT_OK && data != null && data.getData() != null) {
   Uri filePath = data.getData();
   selectedPath = getRealPathFromURI(filePath);
   ImageUtil.setPic(clickedView, selectedPath);
   if(clickedView.getId() == totalImageCount && totalImageCount < 4)          
   {
      newImageView(clickedView.getId() + 1);
      totalImageCount++;
   }

private void newImageView(int id) {

        LayoutInflater inflater = (LayoutInflater)getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        View rl = inflater.inflate(R.layout.relative_image, null);

        NetworkImageView niv = (NetworkImageView) rl.findViewById(R.id.imageViewAdd);
        niv.setOnClickListener(this);
        niv.setId(id);

        ImageButton imgBtn = (ImageButton) rl.findViewById(R.id.imageBtnClose);
        imgBtn.setOnClickListener(this);
        imgBtn.setId(id);

        rl.setId(id);

        ImageLoader imageLoader = CustomVolleyRequest.getInstance(this.getApplicationContext())
                .getImageLoader();
        imageLoader.get(Config.IMAGE_PATH_URL, ImageLoader.getImageListener(niv,
                R.drawable.image, android.R.drawable
                        .ic_menu_camera));
        niv.setImageUrl(selectedPath, imageLoader);

        layout.addView(rl, id);
}

relative_image.xml

<?xml version="1.0" encoding="utf-8"?>

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/relative"
    android:layout_width="100dp"
    android:layout_height="100dp" >

    <com.android.volley.toolbox.NetworkImageView
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:id="@+id/imageViewAdd"
        android:adjustViewBounds="true"
        android:scaleType="centerCrop"
        android:background="@color/colorAccent"
        android:contentDescription="@string/description" />

    <ImageButton
        android:id="@+id/imageBtnClose"
        android:layout_width="25dp"
        android:layout_height="25dp"
        android:layout_gravity="right"
        android:layout_alignParentTop="true"
        android:layout_alignParentRight="true"
        android:src="@drawable/ic_close_black_24dp" />

</FrameLayout>

1 个答案:

答案 0 :(得分:1)

您的代码存在许多非常严重的问题。我将开始滥用id s。

您不应将id属性用于此目的。考虑到您坚持使用相同的机制删除图片,最好使用tag属性。保持id完好无损,并更改tag的{​​{1}}值。这样,当您删除图片时,您的代码就会变成imgBtn。您的代码中的另一个问题是您为多个小部件提供相同的ID。这绝不会在应用程序中发生,因为它很难跟踪不同的对象,尽管在您的应用程序中它没有造成任何损害。

我认为有更好的方法来执行你想做的事情。在layout.removeViewAt(Integer.parse(v.getTag().toString()));功能中,删除更改newImageView的行。然后你点击功能变成这样:

id

此代码应该照顾您的应用程序。