2015-10-25 16 views
11

Sto lavorando a un'attività in cui ho creato uno custom view che sto aggiungendo dinamicamente in un LinearLayout. Il problema è che non riesco a dare un margine tra le visualizzazioni personalizzate che aggiungo.La vista personalizzata non dà margine

Ecco le due viste che ho aggiunto, una accanto all'altra.

Screentshot:

enter image description here

codice per creare il punto di vista dinamico:

private void AddSelectedTagUI(final com.main.feedify.serializers.Tags tag){ 

    LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    View v = inflater.inflate(R.layout.tags,tags_section_selectedtags,false); 

    TextView tagName = (TextView)v.findViewById(R.id.customview_tags_name); 
    tagName.setText(tag.getTagName()); 

    ImageView close_button = (ImageView)v.findViewById(R.id.customview_tags_close); 

    close_button.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      RemoveTag(tag.getTagID(), selectedTags); 
     } 
    }); 

    RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT); 

    tags_section_selectedtags.addView(v, params); 


    // cast view to tags and add it in our layout. 
    // this will help us find out the tag we wanna delete. 

    view_selectedTags.add(v); 
    this.UpdateMessage(true); 
} 

tags.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_height="wrap_content" 
    android:layout_width="wrap_content" 
    android:orientation="horizontal" 
    android:background="@drawable/tags" 
    android:padding="5dp" 
    android:id="@+id/custom_tag" 
    > 

    <TextView android:id="@+id/customview_tags_name" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Beyonce" 
     android:layout_marginLeft="10dp" 
     android:layout_marginRight="3dp" 
     android:layout_centerVertical="true" 
     android:textColor="@android:color/white" 
     android:textSize="@dimen/title" /> 

    <ImageView 
     android:id="@+id/customview_tags_close" 
     android:layout_width="wrap_content" 
     android:layout_marginTop="2dp" 
     android:layout_toRightOf="@+id/customview_tags_name" 
     android:layout_height="wrap_content" 
     android:src="@drawable/close" 
     android:layout_marginLeft="3dp" 
     android:layout_marginRight="10dp" 
     /> 

</RelativeLayout> 

activity_tags.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="@color/background"> 

    <TextView 
     android:id="@+id/tags_lbl_taginfo" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_centerHorizontal="true" 
     android:text="Add at least 4 favorite topics" 
     android:layout_marginTop="20dp" 
     /> 

    <LinearLayout 
     android:orientation="horizontal" 
     android:layout_below="@+id/tags_lbl_taginfo" 
     android:layout_width="match_parent" 
     android:layout_height="190dp" 
     android:layout_marginTop="15dp" 
     android:layout_marginLeft="15dp" 
     android:layout_marginRight="15dp" 
     android:id="@+id/tags_section_selectedtags"> 




    </LinearLayout> 


    <EditText 
     android:id="@+id/tags_txt_tags" 
     android:layout_below="@+id/tags_section_selectedtags" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_marginTop="35dp" 
     android:hint="Add tags ..." 
     android:textColor="@color/tags_edittext" 
     android:paddingTop="15dp" 
     android:singleLine="true" 
     android:paddingLeft="9dp" 
     android:paddingBottom="15dp" 
     android:background="@drawable/tags_edittext" 
     /> 

    <TextView 
     android:id="@+id/tags_lbl_tagsuggestion" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_centerHorizontal="true" 
     android:text="Suggestions" 
     android:layout_marginTop="15dp" 
     android:layout_below="@id/tags_txt_tags" 
     /> 

</RelativeLayout> 

personalizzato Tag Classe: margini

package com.main.feedify.custom_views; 

import android.app.Activity; 
import android.content.Context; 
import android.util.AttributeSet; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ImageView; 
import android.widget.LinearLayout; 
import android.widget.RelativeLayout; 
import android.widget.TextView; 

import com.main.feedify.feedify_mockup.R; 
import com.tokenautocomplete.TokenCompleteTextView; 
/** 
* Created by Muazzam on 10/17/2015. 
*/ 
public class Tags extends RelativeLayout{ 

    private com.main.feedify.serializers.Tags tag; 

    public Tags(Context context, AttributeSet attrs) 
    { 
     super(context, attrs); 
     LayoutInflater inflater = LayoutInflater.from(context); 
     inflater.inflate(R.layout.tags,this); 
    } 

    public void setTag(com.main.feedify.serializers.Tags t){ 
     this.tag = t; 
    } 

    public com.main.feedify.serializers.Tags getTag(){ 
     return this.tag; 
    } 

    @Override 
    protected void onLayout(boolean changed, int left, int top, int right, int bottom) { 
     MarginLayoutParams margins = MarginLayoutParams.class.cast(getLayoutParams()); 
     int margin = 5; 
     margins.topMargin = 0; 
     margins.bottomMargin = 0; 
     margins.leftMargin = margin; 
     margins.rightMargin = 0; 
     setLayoutParams(margins); 
    }; 
} 
+1

Perché non impostare 'layout_margin' nel file XML per il tag, lo stesso che si è fatto con il padding? – Marko

+0

Non sono sicuro del motivo per cui ha iniziato a funzionare ora ho provato anche questo prima. Comunque grazie mille per l'aiuto. Questo risolve il problema, – Mj1992

+0

Felice di sentire che sta funzionando :). – Marko

risposta

2

Si dovrebbe provare a impostare il layout_margin al RelativeLayout nel file XML, lo stesso come avete fatto con l'imbottitura.

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_height="wrap_content" 
    android:layout_width="wrap_content" 
    android:orientation="horizontal" 
    android:background="@drawable/tags" 
    android:layout_margin="5dp" 
    android:padding="5dp" 
    android:id="@+id/custom_tag"> 

    <TextView android:id="@+id/customview_tags_name" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Beyonce" 
     android:layout_marginLeft="10dp" 
     android:layout_marginRight="3dp" 
     android:layout_centerVertical="true" 
     android:textColor="@android:color/white" 
     android:textSize="@dimen/title" /> 

    <ImageView 
     android:id="@+id/customview_tags_close" 
     android:layout_width="wrap_content" 
     android:layout_marginTop="2dp" 
     android:layout_toRightOf="@+id/customview_tags_name" 
     android:layout_height="wrap_content" 
     android:src="@drawable/close" 
     android:layout_marginLeft="3dp" 
     android:layout_marginRight="10dp" /> 

</RelativeLayout> 
+0

Voglio solo aggiungere un accenno: questo creerà un RelativeLayout extra da creare. Ad esempio 'customview_tags_name' sarà a due livelli dalla decomposizione con' custom_tag' che è l'unico figlio del RelativeLayout esterno. – CodyEngel

4

che si sta configurando in Pixel. Prova a convertirli in dp, in modo che il valore dei margini diventi indipendente dalla densità del display.

@Override 
    protected void onLayout(boolean changed, int left, int top, int right, int bottom) { 
     MarginLayoutParams margins = MarginLayoutParams.class.cast(getLayoutParams()); 
     int margin = pxToDp(5); 
     margins.topMargin = 0; 
     margins.bottomMargin = 0; 
     margins.leftMargin = margin; 
     margins.rightMargin = 0; 
     setLayoutParams(margins); 
    }; 

private int pxToDp(int px) { 
     return (int) (px/Resources.getSystem().getDisplayMetrics().density); 
} 

EDIT:

Sbarazzarsi del codice margine onLayout() e impostare i margini, quando si sta mettendo questo punto di vista all'interno di un viewgroup come LinearLayout o RelativeLayout ecc

+0

Ciao, grazie per la risposta, ma questo non funziona, ho provato a eseguire il debug dell'applicazione e ho scoperto che il debugger non si ferma su questa funzione quando provo ad aggiungere un tag dinamicamente. – Mj1992

+0

Non è possibile che onLayout() non venga chiamato. Guardando il tuo codice, perché stai assegnando di nuovo i param se li hai già assegnati all'interno di onLayout(). Parametri RelativeLayout di secondo utilizzo se il genitore della vista del tag è RelativeLayout. Penso che sia meglio assegnare parametri alla vista tag una volta che li hai gonfiati, non dentro onLayout(). –

+0

Sto eseguendo il debug e non sta chiamando. Altrimenti si sarebbe fermato lì quando aggiungo una vista. Poi ho anche rinominato la mia classe 'Tags' e ho provato ad eseguire la stessa attività e funziona senza intoppi con gli stessi problemi. Mi sembra che l'attività "Tags" non venga utilizzata o non giochi correttamente. Dove vuoi che usi i parametri RelativeLayout? Non ho capito che – Mj1992

0

I pensare che il problema risiede in questo pezzo di codice:

@Override 
protected void onLayout(boolean changed, int left, int top, int right, int bottom) { 
    MarginLayoutParams margins = MarginLayoutParams.class.cast(getLayoutParams()); 
    int margin = 5; 
    margins.topMargin = 0; 
    margins.bottomMargin = 0; 
    margins.leftMargin = margin; 
    margins.rightMargin = 0; 
    setLayoutParams(margins); 
}; 

Qui si modificano i parametri di layout all'interno dello 0 Metodoe dovrebbe portare al layout infinito della vista: la vista padre della vista personalizzata chiama onLayout() che chiama setLayoutParams() che risulta in onLayout() ... E così via.
Un modo per evitare questo comportamento è aggiungere i margini nel file tags.xml, proprio come hai fatto con i paddings. Il ciclo di layout infinito sparirà e la tua vista avrà la possibilità di impostare i suoi margini.

0

Ho progettato una vista in modo dinamico e ho dato parametri quali come la vostra, uno sguardo a questo codice:

https://stackoverflow.com/a/33339420/5479863

e convertire in dp dall'uso pixel questo metodo

private int getPixelsToDP(int dp) { 
    float scale = getResources().getDisplayMetrics().density; 
    int pixels = (int) (dp * scale + 0.5f); 
    return pixels; 
} 
1

È necessario aggiungere il margine sinistro per la visualizzazione durante l'aggiunta.

RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT); 
//add this line 
    params.leftMargin=50; 
//end 
    tags_section_selectedtags.addView(v, params); 
Problemi correlati