2015-09-28 2 views
3

Je suis un plus récent sur la construction de l'application Android. Je veux ajouter une nouvelle "vue personnalisée", qui est composée de boutons et imageView, quand je clique sur le bouton dans MainActivity. J'ai suivi une partie de la liste des sites Web ci-dessous pour créer une vue personnalisée.Android: Comment ajouter dynamiquement une "vue personnalisée" dans une mise en page linéaire

javatechig developer.android.com

Ils fonctionnent parfaitement. Cependant, si je veux ajouter dynamiquement une vue personnalisée avec

sView sview = new sView(MainActivity.this); 

rien ne se passe plus tard ...

Ou si je veux nouvelle vue personnalisée par

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

Où puis-je trouver et définir les attrs ????

Voici mon code, dans le 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); 
     } 
    }); 
} 

dans la vue personnalisée,

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 
} 

et le fichier 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> 

et correspondant voir 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> 

Répondre

1

Utilisez le LayoutInflator pour créer une vue en fonction de votre modèle de mise en page, puis l'injecter dans la vue où vous en avez besoin.

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)); 

Vous devrez peut-être ajuster l'index à l'endroit où vous souhaitez insérer la vue.

Source: Android - Dynamically Add Views into View

+0

GRANDE réponse à la question! Merci beaucoup!! – Anthony

0

Vous pouvez ajouter une fonction getter et setter. attrs utilisés dans xml.or u peut faire comme ceci:

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

pouvez-vous décrire votre méthode en détails? – Anthony