Android动态添加子视图 - Inflaters?需要一般建议

时间:2011-11-22 03:18:37

标签: java android

我来自iOS世界。在iOS中添加子视图非常简单:[mySuperView addSubview:myCustomView]。我可以随时随地做到这一点。 Android似乎更复杂。

我有自定义视图。我只是想以编程方式加载我想要的任意数量的自定义视图。

所以我做MyCustomView view = new MyCustomView(this)。

我现在该怎么办?

我已经做了一年的Android应用程序(商业应用程序),但是真的想开始进入Android的图形方面,但我不知道从哪里开始。似乎总有10种方法可以在Android中完成单个任务。我已经阅读了4本Android书籍,它们都提供了相同的基本初学者手持内容。 (在xml中创建布局,然后在代码中查找id等,等等。)

  1. 如何解决当前的问题?

  2. 如何更好地了解布局参数,画布和&图形绘制,以及更高级的Android主题。

  3. 我想知道事情背后的“为什么”。例如,为什么我看到大多数人编写自己的自定义列表视图和适配器而不使用提供的Android版本,对于标签主机也是如此。我觉得我在这里错过了一些晦涩难懂的知识宝石。

    MY CUSTOM VIEW CLASS:

    package com.spentaklabs.view;
    
    import android.content.Context;
    import android.graphics.Canvas;
    import android.graphics.drawable.Drawable;
    import android.util.AttributeSet;
    import android.view.MotionEvent;
    import android.view.View;
    
    
    public class MAView extends View
    {
    Drawable image;
    
    private float mPosX;
    private float mPosY;
    
    private float mLastTouchX;
    private float mLastTouchY;
    
    private static final int INVALID_POINTER_ID = -1;
    
    private int mActivePointerId = INVALID_POINTER_ID;
    
    public MAView(Context context)
    {
        super(context);
        image = context.getResources().getDrawable(R.drawable.hatshairears0);
        image.setBounds(0, 0, image.getIntrinsicWidth(), image.getIntrinsicHeight());
    }
    
    public MAView(Context context, AttributeSet attrs, int defStyle)
    {
        super(context,attrs,defStyle);
    
    }
    
    @Override
    public void onDraw(Canvas canvas)
    {
        canvas.save();
        canvas.translate(mPosX, mPosY);
        image.draw(canvas);
        canvas.restore();
    }
    
    @Override
    public boolean onTouchEvent(MotionEvent ev)
    {
        final int action = ev.getAction();
    
        switch (action)
        {
            case MotionEvent.ACTION_DOWN:
            {
                final float x = ev.getX();
                final float y = ev.getY();
    
                mLastTouchX = x;
                mLastTouchY = y;
    
                mActivePointerId = ev.getPointerId(0);
                break;
            }
    
            case MotionEvent.ACTION_MOVE:
            {
                final int pointerIndex = ev.findPointerIndex(mActivePointerId);
                final float x = ev.getX(pointerIndex);
                final float y = ev.getY(pointerIndex);
                final float dx = x - mLastTouchX;
                final float dy = y - mLastTouchY;
    
                mPosX += dx;
                mPosY += dy;
    
                invalidate();
                break;
    
            }
    
            case MotionEvent.ACTION_UP: 
            {
                mActivePointerId = INVALID_POINTER_ID;
                break;
            }
    
            case MotionEvent.ACTION_CANCEL: 
            {
                mActivePointerId = INVALID_POINTER_ID;
                break;
            }
    
            case MotionEvent.ACTION_POINTER_UP:
            {
                // Extract the index of the pointer that left the touch sensor
                final int pointerIndex = (action & MotionEvent.ACTION_POINTER_ID_MASK) >> MotionEvent.ACTION_POINTER_ID_SHIFT;
                final int pointerId = ev.getPointerId(pointerIndex);
    
                if (pointerId == mActivePointerId)
                {
                    // This was our active pointer going up. Choose a new
                    // active pointer and adjust accordingly.
                    final int newPointerIndex = pointerIndex == 0 ? 1 : 0;
                    mLastTouchX = ev.getX(newPointerIndex);
                    mLastTouchY = ev.getY(newPointerIndex);
                    mActivePointerId = ev.getPointerId(newPointerIndex);
                }
                break;
            }
        }
        return true;
    }
    
    }
    

2 个答案:

答案 0 :(得分:3)

Android提供的便利类适用于很多用例,例如ListActivity等。当人们需要做的事情不能用于开箱即用的类时,他们会编写自己的适配器,我说“写自己的”,但实际上它更简单,至少在适配器的情况下。对于适配器,您只需扩展BaseAdapter,然后覆盖一些方法并提供您自己的自定义实现。这可能是因为在返回列表项的实际视图等之前,您需要将某些逻辑合并到getView中。

至于以编程方式加载自定义视图,我担心你的问题有点不清楚。但是,如果您只想显示自定义视图,那么您需要的就是获得一个实例,就像您一样,然后在您的Activity中调用setContentView(view)。如果您对您正在尝试做的事情有更具体的问题或解释,我会很乐意提供帮助。

如果您只是尝试将自定义视图添加为其他视图的子视图,则需要在父视图上调用addView(myCustomView)。通常,您还需要提供LayoutParams以使所有内容正确显示。

答案 1 :(得分:0)

这些是动态添加子视图的基本步骤

  1. 创建自定义视图
  2. MyCustomView view = new MyCustomView(this);
  3. 现在将布局参数设置为自定义视图
  4. 现在将其添加到您想要的父级(必须是视图组)