2010-08-02 32 views
5

Ecco l'XML per il layout in cui desidero visualizzare la mia vista personalizzata.Visualizzazione personalizzata non visualizzata

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout 
android:id="@+id/widget273" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:rs="http://schemas.android.com/apk/res/com.bookcessed.booksearch" 
> 
<TextView 
android:id="@+id/csp_tv_title" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:text="Choose Your Source" 
android:textSize="40sp" 
android:textColor="#ffc83200" 
android:gravity="center" 
android:paddingTop="15dip" 
android:paddingBottom="75dip" 
android:layout_alignParentTop="true" 
android:layout_centerHorizontal="true" /> 
<com.bookcessed.booksearch.SearchProviderButton 
android:id="@+id/csp_spb_1" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:layout_centerHorizontal="true" 
android:layout_below="@+id/csp_tv_title" 
rs:providerName="BOOKP" /> 
</RelativeLayout> 
> 

Ecco XML della visualizzazione personalizzata:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout 
xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:rs="http://schemas.android.com/apk/res/com.bookcessed.booksearch" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" > 
<RelativeLayout 
android:id="@+id/pv_rl_strings" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:gravity="center" 
android:layout_alignParentTop="true" > 
<TextView 
android:id="@+id/pv_tv_search" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:text="Search" 
android:layout_toRightOf="@+id/pv_tv_and" 
android:textSize="18sp" 
android:textColor="#ff11ab37" 
android:layout_alignParentTop="true" /> 
<TextView 
android:id="@+id/pv_tv_and" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:text=" and " 
android:textSize="18sp" 
android:paddingLeft="6dip" 
android:paddingRight="6dip" 
android:textColor="#ff000000" 
android:layout_centerHorizontal="true" /> 
<TextView 
android:id="@+id/pv_tv_browse" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:text="Browse" 
android:textSize="18sp" 
android:textColor="#ff0077bb" 
android:layout_alignParentTop="true" 
android:layout_toLeftOf="@+id/pv_tv_and" /> 
<ImageView 
android:id="@+id/pv_logo" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:layout_below="@+id/pv_tv_search" 
android:layout_centerInParent="true" 
android:layout_alignTop="@+id/pv_tv_and" 
android:src="@drawable/bookp_logo" 
/> 
</RelativeLayout> 

<RelativeLayout 
android:id="@+id/pv_rl_genres" 
android:layout_width="wrap_content" 
android:layout_below="@+id/pv_rl_strings" 
android:layout_height="wrap_content" 
android:layout_centerHorizontal="true" 
> 
<ImageView 
android:id="@+id/pv_genre1" 
android:layout_width="30dip" 
android:layout_height="30dip" 
android:layout_alignParentTop="true" 
android:layout_alignParentLeft="true" 
> 
</ImageView> 
<ImageView 
android:id="@+id/pv_genre2" 
android:layout_width="30dip" 
android:layout_height="30dip" 
android:layout_alignParentTop="true" 
android:layout_toRightOf="@+id/pv_genre1" 
> 
</ImageView> 
<ImageView 
android:id="@+id/pv_genre3" 
android:layout_width="30dip" 
android:layout_height="30dip" 
android:layout_alignParentTop="true" 
android:layout_toRightOf="@+id/pv_genre2" 
> 
</ImageView> 
<ImageView 
android:id="@+id/pv_genre4" 
android:layout_width="30dip" 
android:layout_height="30dip" 
android:layout_alignParentTop="true" 
android:layout_toRightOf="@+id/pv_genre3" 
> 
</ImageView> 
<ImageView 
android:id="@+id/pv_genre5" 
android:layout_width="30dip" 
android:layout_height="30dip" 
android:layout_alignParentTop="true" 
android:layout_toRightOf="@+id/pv_genre4" 
> 
</ImageView> 
<ImageView 
android:id="@+id/pv_genre6" 
android:layout_width="30dip" 
android:layout_height="30dip" 
android:layout_alignParentTop="true" 
android:layout_toRightOf="@+id/pv_genre5" 
> 
</ImageView> 
<ImageView 
android:id="@+id/pv_genre7" 
android:layout_width="30dip" 
android:layout_height="30dip" 
android:layout_alignParentTop="true" 
android:layout_toRightOf="@+id/pv_genre6" 
> 
</ImageView> 
<ImageView 
android:id="@+id/pv_genre8" 
android:layout_width="30dip" 
android:layout_height="30dip" 
android:layout_alignParentTop="true" 
android:layout_toRightOf="@+id/pv_genre7" /> 
<ImageView 
android:id="@+id/pv_genre9" 
android:layout_width="30dip" 
android:layout_height="30dip" 
android:layout_alignParentTop="true" 
android:layout_toRightOf="@+id/pv_genre8" /> 
</RelativeLayout> 

</RelativeLayout> 

Ecco la SearchProviderButton classe:

public class SearchProviderButton extends LinearLayout { 

private Connector connector; 
private Context context; 
private View inflatedView; 



public SearchProviderButton(Context context, AttributeSet attrs) { 
    super(context, attrs); 

    TypedArray a = getContext().obtainStyledAttributes(attrs,R.styleable.SearchProviderButton); 
    connector = SearchProvider.valueOf(a.getString(R.styleable.SearchProviderButton_providerName)).getConnector(); 

    this.context = context; 
    setFocusable(true); 
    setBackgroundColor(Color.WHITE); 
    setVisibility(VISIBLE); 

    //setOnClickListener(listenerAdapter); 
    setClickable(true); 

} 



@Override 
protected void onFinishInflate() { 
    super.onFinishInflate(); 

    LayoutInflater li = LayoutInflater.from(context); 
    inflatedView = li.inflate(R.layout.provider_view, null); 


    ImageView logo = (ImageView)inflatedView.findViewById(R.id.pv_logo); 
    logo.setImageResource(connector.getLogoDrawableID()); 


    TextView searchTV = (TextView)inflatedView.findViewById(R.id.pv_tv_search); 
    TextView andTV = (TextView)inflatedView.findViewById(R.id.pv_tv_and); 
    if(!connector.isSearchSupported()){ 
    andTV.setText(""); 
    searchTV.setVisibility(GONE); 
    } 

    setgenreIcons(); 
} 



public Connector getConnector(){ 
    return connector; 
} 

public void setConnector(Connector connector){ 
    this.connector = connector; 
} 


private void setgenreIcons(){ 
    int[] genreIconDrawables = {R.id.pv_genre1,R.id.pv_genre2, R.id.pv_genre3, 
    R.id.pv_genre4, R.id.pv_genre5, R.id.pv_genre6, R.id.pv_genre7, 
    R.id.pv_genre8, R.id.pv_genre9}; 

    ArrayList<Genre> availgenre = connector.getAvailablegenres(); 
    availgenre.remove(Genre.ALL); 

    int counter = 0; 
    for(int genreIVid : genreIconDrawables){ 
    ImageView curgenreImageView = (ImageView)inflatedView.findViewById(genreIVid); 
    if(counter < availgenre.size() - 1){ 
    curgenreImageView.setImageResource(availgenre.get(counter).getDrawable()); 
    } else { 
    curgenreImageView.setVisibility(GONE); 
    } 
    counter++; 
    } 
} 

protected void onFocusChanged(boolean gainFocus, int direction, Rect previouslyFocusedRect) { 
    if (gainFocus == true){ 
    this.setBackgroundColor(Color.rgb(255, 165, 0)); 
    } else { 
    this.setBackgroundColor(Color.WHITE); 
    } 
} 


} 

ecco il codice per la classe di caricare il XML che contiene la mia componente personalizzato:

bookPServiceProviderButton = (SearchProviderButton)findViewById(R.id.csp_spb_1); 
bookPServiceProviderButton.setOnClickListener(SPBOnClickListener); 
bookPServiceProviderButton.setConnector(new bookPConnector()); 
bookPServiceProviderButton.setVisibility(View.VISIBLE); 

EDIT: Dopo il primo commento, ho aggiunto questo codice:

@Override 
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
     super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
     int widthSpec = MeasureSpec.getMode(widthMeasureSpec); 
     int width = MeasureSpec.getSize(widthMeasureSpec); 
     int heightSpec = MeasureSpec.getMode(heightMeasureSpec); 
     int height = MeasureSpec.getSize(heightMeasureSpec); 

    setMeasuredDimension(width, height); 

} 

Ora ha una larghezza e un'altezza, ma nulla sta rivelando al suo interno!

+0

Il visualizzatore di heirarchy, trovato nella cartella degli strumenti, potrebbe aiutarti qui. Ha visualizzato l'albero delle viste per te. E 'possibile che la tua vista abbia 0 larghezza e altezza, o qualcosa del genere. –

+0

Sì, ha 0 larghezza e 0 altezza. Come faccio a confezionare wrap_content nei miei contenuti? (Grazie per il suggerimento dal modo in cui questa cosa è nifty) –

risposta

7

vostra abitudine visualizzazione layout non viene visualizzato perché non siete mettere niente in esso. Nella tua onFinishInflate hai la linea inflatedView = li.inflate(R.layout.provider_view, null); ma non la aggiungi alla tua vista. Hai due opzioni per aggiungere le viste alla tua vista di layout personalizzata.

modificare la visualizzazione personalizzato per estendere RelativeLayout, modificare il allegando RelativeLayout-<merge> nel vostro provider_view.xml, e riparare il vostro findViewId linee per this.findViewId(...) in quanto i punti di vista saranno gonfiati nel layout.

nel layout xml fare:

<com.bookcessed.booksearch.SearchProviderButton 
android:id="@+id/csp_spb_1" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:layout_centerHorizontal="true" 
android:layout_below="@+id/csp_tv_title" 
rs:providerName="BOOKP"> 
    <!-- include this so it's added to your custom layout view --> 
    <include layout="@layout/provider_view" /> 
</com.bookcessed.booksearch.SearchProviderButton> 

provider_view diventa:

<?xml version="1.0" encoding="utf-8"?> 
<merge 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:rs="http://schemas.android.com/apk/res/com.bookcessed.booksearch" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" > 
    <RelativeLayout 
    android:id="@+id/pv_rl_strings" 
    . 
    . 
    . 
</merge> 

SearchProviderButton:

public class SearchProviderButton extends RelativeLayout{ 
. 
. 
. 

@Override 
protected void onFinishInflate() { 
    super.onFinishInflate(); 

    //the <include> in the layout file has added these views to this 
    //so search this for the views 
    ImageView logo = this.findViewById(R.id.pv_logo); 
    logo.setImageResource(connector.getLogoDrawableID()); 


    TextView searchTV = (TextView)this.findViewById(R.id.pv_tv_search); 
    TextView andTV = (TextView)this.findViewById(R.id.pv_tv_and); 
    if(!connector.isSearchSupported()){ 
    andTV.setText(""); 
    searchTV.setVisibility(GONE); 
    } 

    setgenreIcons(); 
} 
. 
. 
. 

Oppure si potrebbe gonfiare correttamente la visualizzazione in onCreate da layoutInflater.inflate(R.layout.provider_view, this, true). Quella chiamata gonfierà il layout di riferimento nel passato ViewGroup, in questo caso la tua vista personalizzata, e aggiungerà il gonfiato View s ad esso. Quindi puoi correggere le chiamate findViewId nel tuo onFinishInflate.

+0

Penso di aver provato entrambi i modi di farlo, ma probabilmente non farlo correttamente. Non riesco a capirlo. –

+0

Ho aggiornato la risposta per includere esempi delle modifiche necessarie per il primo metodo. – Qberticus

+0

GRAZIE! Spero che qualcuno possa aiutarti quanto mi hai appena aiutato!Grazie mille molto. Non sarei mai stato in grado di mettere insieme 2 e 2 insieme. Grazie ancora! –

2

Per wrap_content, è necessario implementare correttamente le funzioni measure e layout per la visualizzazione personalizzata. Vedi How Android Draws Views per dettagli su cosa significano questi metodi.

La mia ipotesi è che getMeasureWidth() e getMeasureHeight() funzioni per la visualizzazione sono sempre tornando 0.

Problemi correlati