2010-08-02 6 views
5

Вот XML для макета, в котором я хочу, чтобы мое пользовательское представление появилось.Пользовательский вид не отображается

<?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> 
> 

Вот XML пользовательского вида в:

<?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> 

Вот класс SearchProviderButton:

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


} 

Вот код для класса загружающего XML, который содержит свой собственный компонент:

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

EDIT: После первого комментария, я добавил этот код:

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

} 

Теперь она имеет ширину и высоту, но ничего не показывая внутри него!

+0

Хранитель иерархических представлений, найденный в папке с инструментами, может помочь вам здесь. Он визуализировал дерево просмотра для вас. Возможно, что ваши взгляды имеют ширину и высоту 0 или что-то в этом роде. –

+0

Да, он имеет 0 ширины и 0 высоты. Как заставить wrap_content обернуть мой контент? (Спасибо за подсказку, кстати эта штука отличная) –

ответ

7

Ваш пользовательский вид макета не появляется, потому что вы не положить что-нибудь в него. В вашем onFinishInflate у вас есть строка inflatedView = li.inflate(R.layout.provider_view, null); Но вы не добавляете это к своему виду. У вас есть два варианта добавления представлений в пользовательский вид макета.

Изменить пользовательский вид расширить RelativeLayout, изменить охватывающую RelativeLayout к <merge> в вашем provider_view.xml и исправить свои findViewId линий, чтобы this.findViewId(...), так как мнения будут завышены в макет.

в макете XML сделать:

<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 становится:

<?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(); 
} 
. 
. 
. 

Или вы могли бы правильно надуть вид в onCreate по layoutInflater.inflate(R.layout.provider_view, this, true). Этот вызов раздует ссылочный макет в пройденный ViewGroup, в этом случае ваш пользовательский вид и добавит надутые View s к нему. Затем вы можете исправить findViewId звонки в onFinishInflate.

+0

Я думаю, что я пробовал оба способа сделать это, но, вероятно, не делал это правильно. Я не могу это получить. –

+0

Я обновил ответ, чтобы включить примеры необходимых изменений для первого метода. – Qberticus

+0

СПАСИБО! Я надеюсь, что кто-то может помочь вам так же, как вы мне помогли!Большое спасибо. Я бы никогда не смог собрать 2 и 2 вместе. Еще раз спасибо! –

2

Для обеспечения работы wrap_content вам необходимо правильно реализовать функции measure и layout для вашего пользовательского вида. См. How Android Draws Views для получения информации о том, что означают эти методы.

Мое предположение было бы, что getMeasureWidth() и getMeasureHeight() функции для вашего зрения всегда возвращаются 0.

Смежные вопросы