简体   繁体   中英

Inflate custom android widget

I know there are dozens similar post, but it looks to me everything is correct here:

The custom widget:

public class DoubleTextItem extends LinearLayout {

private TextView txtMain;
private TextView txtDescription;

public DoubleTextItem(Context context) {
    super(context);
}
public DoubleTextItem(Context context, AttributeSet attrs) {
    super(context, attrs);
}

@Override
protected void onFinishInflate() {
    super.onFinishInflate();
    ((Activity)getContext()).getLayoutInflater().inflate(R.layout.widget_double_text_item, this);
    setupViewItems();
}

private void setupViewItems() {
    txtMain = (TextView) findViewById(R.id.txtMain);
    txtDescription = (TextView) findViewById(R.id.txtDecription);
}
public void setDescription(String text) {
    txtDescription.setText(text);
}
}

The custom widget layout xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >

    <TextView
    android:id="@+id/txtMain"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />

    <TextView
    android:id="@+id/txtDecription"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />

</LinearLayout>

ANd here inside an activity function i get a casting error,

LayoutInflater inflater = LayoutInflater.from(this);
DoubleTextItem item = (DoubleTextItem) inflater.inflate(R.layout.widget_double_text_item, layout);              
item.setText(som-txt);
item.setDescription("#"+athlete.getString("position"));

Here, the root View is a LinearLayout but you try to cast it your custom class:

DoubleTextItem item = (DoubleTextItem) inflater.inflate(R.layout.widget_double_text_item, layout);              

The standard advice is:

All DoubleTextItems are LinearLayouts, but not all LinearLayouts are DoubleTextItems.

Meaning you cannot downcast objects from a LinearLayout to a DoubleTextItem, there are too many assumptions and Java won't let you do it.

If you want a DoubleTextItem in your layout you need to use:

<your.package.name.DoubleTextItem 
    ... />

(Also, calling inflate inside onFinishInflate() seems a little silly especially since you don't save the inflated item... If you want to inflate a different layout, don't inflate the first one.)


Overall it looks like you are trying to recreate the now deprecated TwoLineListItem , perhaps you can learn some pointers from it's source code (or just use the TwoLineListItem.)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM