2010-08-02 40 views
5

Özel görünümümün görünmesini istediğim düzen için XML. İşte Özel Görünüm görünmüyor

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


} 

benim özel bileşen içeren xml yükleme sınıf için kod şudur: Burada
<?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> 

sınıf SearchProviderButton: İşte
<?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> 
> 

özel görünümün XML geçerli:

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

DÜZENLEME:

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

} 

Şimdi bir genişlik ve yüksekliğe sahip, ama hiçbir şey bunun içinde sona gösteriyor: İlk comment sonra bu kodu eklendi!

+0

Araçlar klasöründe bulunan heirarchy görüntüleyici, size burada yardımcı olabilir. Görüntü ağacını sizin için görselleştirdi. Görünümünüzün 0 genişlik ve yüksekliğe sahip olması ya da bunun gibi bir şey olması mümkündür. –

+0

Evet, 0 genişlik ve 0 yükseklik var. Wrap_content içeriklerimi nasıl kaydırırım? (Bu şey şık olana kadar bahşiş için teşekkürler) –

cevap

7

iade olurdu. onFinishInflate'unuzda inflatedView = li.inflate(R.layout.provider_view, null); hattına sahipsiniz ancak bunu kendi görünümünüze eklemezsiniz. Görünümleri özel düzen görünümünüze eklemek için iki seçeneğiniz vardır.

, RelativeLayout uzatmak için özel görünümünüzü değiştirin, provider_view.xml içinde <merge> yerine kapama RelativeLayout değiştirmek ve görünümler düzeni içine şişirilmiş olacağından this.findViewId(...) için sizin findViewId satırları düzeltmek

.

<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 olur:

<?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: En düzeni xml olarak

do

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

Yoksa düzgün layoutInflater.inflate(R.layout.provider_view, this, true) tarafından onCreate görünümü şişirmek olabilir. Bu çağrı, başvurulan düzeni geçirilen ViewGroup'a, bu durumda özel görünümünüze şişirecek ve şişirilmiş View s değerini buna ekleyecektir. Ardından, onFinishInflate numaranızdaki findViewId çağrılarını düzeltebilirsiniz.

+0

Sanırım bunu yapmanın iki yolunu denedim, ama muhtemelen doğru şekilde yapmıyordum. Anlayamıyorum. –

+0

Yanıtı, ilk yöntem için gerekli değişikliklerin örneklerini içerecek şekilde güncelledim. – Qberticus

+0

TEŞEKKÜR EDERİZ! Umarım birileri bana yardım ettiğin kadar yardımcı olabilir!Çok teşekkür ederim. Asla 2 ve 2'yi bir araya getiremezdim. Tekrar teşekkürler! –

2

wrap_content'ın çalışması için, özel Görünümünüz için measure ve layout işlevlerini doğru bir şekilde uygulamanız gerekir. Bu yöntemlerin ne anlama geldiğiyle ilgili ayrıntılar için bkz. How Android Draws Views.

Benim tahminim görünümünüz için getMeasureWidth() ve getMeasureHeight() fonksiyonları her zaman bunu içine bir şey koyarak değiliz çünkü özel düzen görünümü görünmediğini 0.

İlgili konular