2015-09-28 114 views
3

我是构建Android应用程序的新手。 我想添加一个新的“自定义视图”,它由按钮和imageView组成,当我点击MainActivity中的按钮时。 我已经按照下面的一些网站列表来构建自定义视图。Android:如何动态地将“自定义视图”添加到线性布局

javatechig developer.android.com

他们的工作完美。但是,如果我想动态添加自定义视图与

sView sview = new sView(MainActivity.this); 

没有后来发生......

或者,如果我想新的自定义视图通过

sView sview = new sView(MainActivity.this, attrs); 

我在哪里可以找到并设置attrs?

这里是我的代码, 在MainActivity,

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    myDraw = (RelativeLayout) findViewById(R.id.myDraw); 
    btnAddRect = (Button) findViewById(R.id.btnAdd); 

    mfView = (sView) findViewById(R.id.draw); 
    btnAdd.setOnClickListener(new OnClickListener() {  

     @Override 
     public void onClick(View v) { 
      SingleFingerView sFingerView = new sView(MainActivity.this); 
      myDraw.addView(sFingerView); 
     } 
    }); 
} 

在自定义视图,

public class sView extends LinearLayout{ 

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

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

public sView(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
    this._1dp = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 1, context.getResources().getDisplayMetrics()); 
    this.parseAttr(context, attrs); 
    View mRoot = View.inflate(context, R.layout.test_image_view, null); 
    addView(mRoot, -1, -1); 
    mView = (ImageView) mRoot.findViewById(R.id.view); 
    mPushView = (ImageView) mRoot.findViewById(R.id.pview); 
    mFirmView = (ImageView) mRoot.findViewById(R.id.fview); 
    mRemoveView = (ImageView) mRoot.findViewById(R.id.rview); 
} 

private void parseAttr(Context context, AttributeSet attrs) {  
if (attrs == null) return; 
     TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.sView); 
    if (a != null) { 
     int n = a.getIndexCount(); 
     for (int i = 0; i < n; i++) { 
      int attr = a.getIndex(i); 

      if (attr == R.styleable.sView_centerInParent) { 
       this.mCenterInParent = a.getBoolean(attr, true); 
      } ... 
       with some attributes set setting 
     } 
    } 
} 

@Override 
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
    super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
    setParamsForView(widthMeasureSpec, heightMeasureSpec); // some params are set here 
} 

和XML文件 的main.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    xmlns:pushtouch="http://schemas.android.com/apk/res-auto" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:orientation="vertical" 
android:paddingBottom="@dimen/activity_vertical_margin" 
android:paddingLeft="@dimen/activity_horizontal_margin" 
android:paddingRight="@dimen/activity_horizontal_margin" 
android:paddingTop="@dimen/activity_vertical_margin" 
tools:context=".MainActivity" > 
<TextView 
    android:id="@+id/tv_touch" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="abc" 
    android:singleLine="false" 
    /> 
    <Button 
     android:id="@+id/btnAdd" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:text="ADD IMAGE" /> 
<RelativeLayout 
    android:id="@+id/myDraw" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 

<com.example.sView 
     android:id="@+id/draw" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     pushtouch:centerInParent="true" 

     pushtouch:image="@drawable/image" 
     pushtouch:image_width="120dp" 
     pushtouch:image_height="100dp" 

     pushtouch:push_image="@drawable/p_btn" 
     pushtouch:push_image_width="50dp" 
     pushtouch:push_image_height="50dp" 

     pushtouch:firm_image="@drawable/ok" 
     pushtouch:firm_image_width="50dp" 
     pushtouch:firm_image_height="50dp" 

     pushtouch:remove_image="@drawable/remove" 
     pushtouch:remove_image_width="50dp" 
     pushtouch:remove_image_height="50dp" 

     android:scaleType="centerInside" 
     android:layout_alignLeft="@id/result" 
     android:layout_alignTop="@id/result" 
     android:layout_alignRight="@id/result" 
     android:layout_alignBottom="@id/result" 
     /> 
</RelativeLayout> 
</LinearLayout> 

和相应的查看t_view.xml

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     android:id="@+id/drawLayout" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent"> 
<ImageView 
     android:id="@+id/view" 
     android:layout_width="200dp" 
     android:layout_height="200dp" 
     android:focusableInTouchMode="true" 
     android:focusable="true"/> 
<ImageView 
     android:id="@+id/push_view" 
     android:layout_width="50dp" 
     android:layout_height="50dp" 
     android:clickable="true" 
     android:focusable="true" 
     android:focusableInTouchMode="true" 
     /> 
<ImageView 
     android:id="@+id/firm_view" 
     android:layout_width="50dp" 
     android:layout_height="50dp" 
     android:clickable="true" 
     android:focusable="true" 
     android:focusableInTouchMode="true" 
     /> 
<ImageView 
     android:id="@+id/remove_view" 
     android:layout_width="50dp" 
     android:layout_height="50dp" 
     android:clickable="true" 
     android:focusable="true" 
     android:focusableInTouchMode="true" 
     /> 
</FrameLayout> 

回答

1

使用LayoutInflator创建基于您的布局模板视图,然后将其注入到在你需要它的观点。

LayoutInflater vi = (LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
View v = vi.inflate(R.layout.your_layout, null); 

// fill in any details dynamically here 
TextView textView = (TextView) v.findViewById(R.id.a_text_view); 
textView.setText("your text"); 

// insert into main view 
ViewGroup insertPoint = (ViewGroup) findViewById(R.id.insert_point); 
insertPoint.addView(v, 0, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT)); 

您可能需要调整要插入视图的索引。

来源:Android - Dynamically Add Views into View

+0

这个问题的答案很棒!非常感谢!! – Anthony

0

你可以添加一些getter和setter函数。在xml.or使用ATTRS U可以这样做:

test.xml 
<com.example.sView 
    android:id="@+id/draw" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    pushtouch:centerInParent="true" 

    pushtouch:image="@drawable/image" 
    pushtouch:image_width="120dp" 
    pushtouch:image_height="100dp" 

    pushtouch:push_image="@drawable/p_btn" 
    pushtouch:push_image_width="50dp" 
    pushtouch:push_image_height="50dp" 

    pushtouch:firm_image="@drawable/ok" 
    pushtouch:firm_image_width="50dp" 
    pushtouch:firm_image_height="50dp" 

    pushtouch:remove_image="@drawable/remove" 
    pushtouch:remove_image_width="50dp" 
    pushtouch:remove_image_height="50dp" 

    android:scaleType="centerInside" 
    android:layout_alignLeft="@id/result" 
    android:layout_alignTop="@id/result" 
    android:layout_alignRight="@id/result" 
    android:layout_alignBottom="@id/result" 
    /> 
    onclick -> { 
     View v = getLayoutInflater().inflate(R.layout.a,null); 
     myDraw.addView(sFingerView); 
    } 
+0

你能详细描述一下你的方法吗? – Anthony

相关问题