开发者-钟大田 2017-04-05 09:46 采纳率: 100%
浏览 2825
已采纳

Android的自定义ViewGroup addView后发现显示错误

之前的提问:http://ask.csdn.net/questions/375760
之前我以为是系统的问题,最近我发现,对于addView的情况这些不同,addView的是
view(单View)没有问题,一旦addView中,添加的是ViewGroup就会出现添加进来的
ViewGroup会在底层(在Android5.1以上的)。

希望各位大神探索一下。下面是我的代码:

public class MyViewGroup extends ViewGroup {

    public MyViewGroup(Context context) {
        this(context, null, 0);
    }

    public MyViewGroup(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public MyViewGroup(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        //测量子View的大小
        int childCount = getChildCount();
        for (int i = 0; i < childCount; i++) {
            View childAt = getChildAt(i);
            measureChild(childAt, widthMeasureSpec, heightMeasureSpec);
        }
    }

    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        int childCount = getChildCount();
        for (int i = 0; i < childCount; i++) {
            View childView = getChildAt(i);
            childView.layout(0, 0, childView.getMeasuredWidth(), childView.getMeasuredHeight());
        }
    }
}

使用代码

public class MainActivity extends AppCompatActivity {

    MyViewGroup mMyViewGroup;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mMyViewGroup = (MyViewGroup) findViewById(R.id.my_view_group);

        //添加第一个View
        final Button button = new Button(this);
        button.setText("第一个View");
        button.setOnTouchListener(new View.OnTouchListener() {

            private ViewScaleHandler mViewScaleHandler;

            @Override
            public boolean onTouch(View v, MotionEvent event) {
                if (mViewScaleHandler == null) {
                    mViewScaleHandler = new ViewScaleHandler(button);
                }
                return mViewScaleHandler.move(event);
            }
        });
        mMyViewGroup.addView(button);

        //添加第二个View
        final Button button2 = new Button(this);
        button2.setBackgroundColor(Color.BLUE);
        button2.setText("第二个View");
        button2.setOnTouchListener(new View.OnTouchListener() {

            private ViewScaleHandler mViewScaleHandler;

            @Override
            public boolean onTouch(View v, MotionEvent event) {
                if (mViewScaleHandler == null) {
                    mViewScaleHandler = new ViewScaleHandler(button2);
                }
                return mViewScaleHandler.move(event);
            }
        });
        mMyViewGroup.addView(button2);

        //添加第三个View
        //当R.layout.test_1 为单View没有出现问题,View在顶层
//        final View view = LayoutInflater.from(this).inflate(R.layout.test_1, null);
//        view.setBackgroundColor(Color.YELLOW);
//        view.setOnTouchListener(new View.OnTouchListener() {
//            private ViewScaleHandler mViewScaleHandler;
//
//            @Override
//            public boolean onTouch(View v, MotionEvent event) {
//                if (mViewScaleHandler == null) {
//                    mViewScaleHandler = new ViewScaleHandler(view);
//                }
//                return mViewScaleHandler.move(event);
//            }
//        });
//        mMyViewGroup.addView(view);

        //当R.layout.test_1 为ViewGroup出现问题,在Android5.1,这个ViewGroup在底层了
        final View view = LayoutInflater.from(this).inflate(R.layout.test_2, null);
        view.setBackgroundColor(Color.YELLOW);
        view.setOnTouchListener(new View.OnTouchListener() {
            private ViewScaleHandler mViewScaleHandler;

            @Override
            public boolean onTouch(View v, MotionEvent event) {
                if (mViewScaleHandler == null) {
                    mViewScaleHandler = new ViewScaleHandler(view);
                }
                return mViewScaleHandler.move(event);
            }
        });
        mMyViewGroup.addView(view);


    }
}

现象

图片说明

图片说明

  • 写回答

1条回答 默认 最新

  • 开发者-钟大田 2017-07-07 06:35
    关注

    Android5.0以上FramLayout的层结构出现不一致

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 fluent的在模拟压强时使用希望得到一些建议
  • ¥15 STM32驱动继电器
  • ¥15 Windows server update services
  • ¥15 关于#c语言#的问题:我现在在做一个墨水屏设计,2.9英寸的小屏怎么换4.2英寸大屏
  • ¥15 模糊pid与pid仿真结果几乎一样
  • ¥15 java的GUI的运用
  • ¥15 Web.config连不上数据库
  • ¥15 我想付费需要AKM公司DSP开发资料及相关开发。
  • ¥15 怎么配置广告联盟瀑布流
  • ¥15 Rstudio 保存代码闪退