2010-08-02 37 views
5

Đây là XML cho bố cục mà tôi muốn chế độ xem tùy chỉnh của mình xuất hiện.Chế độ xem tùy chỉnh không xuất hiện

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

Đây là giao diện tùy chỉnh của 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> 

Đây là SearchProviderButton lớp:

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


} 

Đây là mã cho lớp tải xml có chứa thành phần tùy chỉnh của tôi:

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

EDIT: Sau khi nhận xét đầu tiên, tôi đã thêm mã này:

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

} 

Bây giờ nó có chiều rộng và chiều cao, nhưng không có gì hiển thị bên trong nó!

+0

Trình xem heirarchy, được tìm thấy trong thư mục công cụ, có thể giúp bạn ở đây. Nó hình dung cây xem cho bạn. Nó có thể là cái nhìn của bạn những thứ nó có 0 chiều rộng và chiều cao, hoặc một cái gì đó như thế. –

+0

Có 0 chiều rộng và 0 chiều cao. Làm cách nào để làm cho wrap_content bao bọc nội dung của tôi? (Cảm ơn cho tip bằng cách này điều này là tiện lợi) –

Trả lời

7

xem bố trí tùy chỉnh của bạn không xuất hiện vì bạn không đặt bất cứ điều gì vào nó. Trong số onFinishInflate bạn có dòng inflatedView = li.inflate(R.layout.provider_view, null); Nhưng bạn không thêm điều đó vào chế độ xem của mình. Bạn có hai tùy chọn để thêm chế độ xem vào chế độ xem bố cục tùy chỉnh của mình.

Thay đổi giao diện tùy chỉnh của bạn để mở rộng RelativeLayout, thay đổi kèm theo RelativeLayout-<merge> trong provider_view.xml của bạn, và sửa chữa findViewId dòng của bạn vào this.findViewId(...) kể từ quan điểm sẽ được thổi phồng thành bố trí của bạn.

Trong xml bố trí của bạn làm:

<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 trở thành:

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

Hoặc bạn có thể thổi phồng đúng quan điểm trong onCreate bởi layoutInflater.inflate(R.layout.provider_view, this, true). Cuộc gọi đó sẽ thổi phồng bố cục được tham chiếu vào số ViewGroup được chuyển qua, trong trường hợp này là chế độ xem tùy chỉnh của bạn và thêm View s tăng lên. Sau đó, bạn có thể sửa các cuộc gọi findViewId trong số onFinishInflate của mình.

+0

Tôi nghĩ rằng tôi đã thử cả hai cách để làm điều đó, nhưng có lẽ không làm điều đó một cách chính xác. Tôi không hiểu được. –

+0

Tôi đã cập nhật câu trả lời để bao gồm các ví dụ về những thay đổi cần thiết cho phương pháp đầu tiên. – Qberticus

+0

CẢM ƠN BẠN! Tôi hy vọng rằng ai đó có thể giúp bạn nhiều như bạn vừa giúp tôi!Cảm ơn bạn rất nhiều. Tôi sẽ không bao giờ có thể tự mình đặt 2 và 2. Cảm ơn một lần nữa! –

2

Để wrap_content hoạt động, bạn cần triển khai đúng các chức năng measurelayout cho Chế độ xem tùy chỉnh của mình. Xem How Android Draws Views để biết chi tiết về ý nghĩa của các phương pháp này.

tôi đoán sẽ là getMeasureWidth()getMeasureHeight() chức năng cho tầm nhìn của bạn luôn luôn trở về 0.

Các vấn đề liên quan