【问题标题】:Inflate custom android widget膨胀自定义 android 小部件
【发布时间】:2013-02-10 19:17:15
【问题描述】:

我知道有几十个类似的帖子,但在我看来一切都是正确的:

自定义小部件:

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

自定义小部件布局 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>

在活动函数内部,我得到一个转换错误,

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

【问题讨论】:

  • 什么是othertxt,它在哪里以及如何设置?
  • 编写代码时很难为您提供帮助:item.setText(som-txt);,除非您看到编译时错误,因为- 是一个数学运算...
  • sometxt 只是 String sometxt = "hello";没有编译时错误。没有警告。仅在执行该方法时才执行。崩溃、退出和以 ClassCastException 结尾的巨大堆栈:在第一种情况下为 LinearLayout.nvm 在第二种情况下。显然那里没有错误。

标签: java android custom-component


【解决方案1】:

这里,根 View 是一个 LinearLayout,但您尝试将其转换为您的自定义类:

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

标准建议是:

所有的 DoubleTextItem 都是 LinearLayout,但并非所有的 LinearLayout 都是 DoubleTextItem。

这意味着您不能将对象从 LinearLayout 向下转换为 DoubleTextItem,假设太多,Java 不会让您这样做。

如果您想在布局中使用 DoubleTextItem,您需要使用:

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

(另外,在 onFinishInflate() 中调用 inflate 似乎有点傻,尤其是因为您不保存膨胀的项目...如果您想膨胀不同的布局,请不要膨胀第一个。)


总体而言,您似乎正在尝试重新创建现已弃用的TwoLineListItem,也许您可​​以从它的source code 中学习一些指针(或者只使用 TwoLineListItem。)

【讨论】:

  • 是的,第 3 天学习和建筑……好像我什么都没得到。生病尝试检查
  • 有些东西我无法理解,我将 LinearLayout 与 package.DoubleTextItem 交换,但现在膨胀 xml 时出现另一个错误。你是什​​么意思 onFinishInflate 是愚蠢的..?是的,我正在尝试做类似 TwoLineListItem 的事情。我试图找到一个关于这个 android 方面的好教程,但我没有找到。我讨厌这些 API,我发现的大多数东西都已被弃用,并且在 dev.andr 上讨厌的是 1% 的市场份额..
  • 好的,点击您的问题下方的"edit" 以发布您的新 XML 和 LogCat 错误,以便我查看发生了什么。另外我相信onFinishInflate() 中的inflate() 命令是不必要的,因为这是你已经膨胀的相同布局并且你没有保存它,所以它什么都不做......
  • 我终于明白了这个问题。不在这里,但这个答案帮助我解决了正确的观点。谢谢
猜你喜欢
  • 2011-06-29
  • 1970-01-01
  • 1970-01-01
  • 2013-04-29
  • 2012-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多