android - ".addView()"用于简单 View

标签 android android-layout

正如您在图片中看到的,我可以选择 View 并使用“_root.addView(dragIcon);”添加 3 个 ImageView。

我的问题是 View 是一个简单 View 而不是 ViewGroup ,这意味着在这张图片中我必须将 3 个图像添加到 RelativeView 背景“root.addView(dragIcon);”而不是图像中显示的绿色矩形 View 。

我很确定我无法将 View 更改为 ViewGroup,因为很多方法(例如 onTouch)都需要“ View ”。我试过将 View 转换为 ViewGroup“((ViewGroup) view).addView(dragIcon);”但这没有用。

您可以在应用中创建多个 View 并将它们四处拖动,因此我需要将 3 个图像设为特定父 View 的 subview 。

感谢任何建议,谢谢!

The Image

这是与这个问题相关的代码部分......

_root = (ViewGroup)findViewById(R.id.root); //This is the background
_view = new View(this); //This is the View (Green in the Image)

private void selectView(final View view) {
    view.setOnTouchListener(new View.OnTouchListener() {
        public boolean onTouch(final View view, final MotionEvent event) {

            view.setOnClickListener(new View.OnClickListener() {
                public void onClick(View v) {

                    ImageView dragIcon, sizeIconTop, sizeIconBottom;

                    if (view.getTag(R.string.viewSelected) != "1") {
                        view.setBackgroundColor(0xFF00AA00);
                        view.setTag(R.string.viewSelected, "1");

                        double Ypos = view.getTranslationY() - view.getHeight() / 2;

                        // Set draggable (6*3 grid on the right)
                        dragIcon = new ImageView(MainActivity.this);
                        dragIcon.setImageResource(R.drawable.drabicon);
                        RelativeLayout.LayoutParams imgParams = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
                        imgParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
                        imgParams.setMargins(0,0,30,0);
                        dragIcon.setLayoutParams(imgParams);
                        dragIcon.setTranslationY((float) Ypos + 70 + view.getHeight() / 2);
                        _root.addView(dragIcon); //Need to change from _root.addView to view.addView

                        // Set size top (White line at the top)
                        sizeIconTop = new ImageView(MainActivity.this);
                        sizeIconTop.setImageResource(R.drawable.resize);
                        RelativeLayout.LayoutParams stImgParams = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
                        stImgParams.setMargins(0,0,30,0);
                        stImgParams.addRule(RelativeLayout.CENTER_HORIZONTAL, RelativeLayout.TRUE);
                        sizeIconTop.setLayoutParams(stImgParams);
                        sizeIconTop.setTranslationY((float) Ypos + 99);
                        _root.addView(sizeIconTop); //Need to change from _root.addView to view.addView

                        // Set size bottom (White line at the bottom)
                        sizeIconBottom = new ImageView(MainActivity.this);
                        sizeIconBottom.setImageResource(R.drawable.resize);
                        RelativeLayout.LayoutParams sbImgParams = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
                        sbImgParams.setMargins(0,0,30,0);
                        sbImgParams.addRule(RelativeLayout.CENTER_HORIZONTAL, RelativeLayout.TRUE);
                        sizeIconBottom.setLayoutParams(sbImgParams);
                        sizeIconBottom.setTranslationY((float) Ypos + 93 + view.getHeight());
                        _root.addView(sizeIconBottom); //Need to change from _root.addView to view.addView


                    } else { //Ignore this part

                        //((ViewGroup) view).removeView(dragIcon);
                        //((ViewGroup) view).removeView(sizeIconTop);
                        //((ViewGroup) view).removeView(sizeIconBottom);

                        view.setBackgroundColor(0xFF00FF00);
                        view.setTag(R.string.viewSelected, "0");
                    }
                }
            });

最佳答案

尽管问题有点令人困惑,但在分析了您的代码后,我弄清楚了您想要做什么。
遗憾的是,您必须选择是使用 View(并且无法附加 ImageView)还是使用 ViewGroup(并自行处理事件)。

由于你的View是一个View,而你的3个ImageView也是View(意思是它们在同一级别的使用),所以你不能把后3个加到第一个上。

规则是: 您可以将 ViewGroups 和 Views 添加到 ViewGroup,但不能将 Views 或 ViewGroups 添加到 View。 View 应该是 Android 设计的基本 block 。

void addView (View child)

Adds a child view. If no layout parameters are already set on the child, the default parameters for this ViewGroup are set on the child.

在我看来,我会让 View 成为一个 ViewGroup 并自己处理 TouchEvents

Check this documentation/code regarding TouchEvents on ViewGroups

让我知道你的进步。很乐意为您提供帮助。

问候,

关于android - ".addView()"用于简单 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38708358/

相关文章:

android - 使用 ObjectAnimator 为 weightSum 属性设置动画

android - 当我到达最后一项时,寻呼机适配器未注册

java - 在 android 上为对象设置动画后应用转换

java - 在 Android 中将类膨胀到 xml 文件中

android - 创建一个 DateTimePicker React-Native Android?

android - 修改堆栈项目计数并在堆栈 View 中显示 ListView / GridView

java - 无法从布局文件夹引用布局

java - 编辑 xml 元素的 "app"属性

android visibility - ImageView 的预留空间

android - 如何在保存之前将任何图像与捕获的相机图像绑定(bind)?