我正在开发一本关于Android编程的书。我运行第一个版本时工作正常。但是,本书接着将样式应用于列表项,当我查看模拟器时程序停止。它涉及一个扩展AppCompatTextView的类,它重新绘制每个列表项作为便条。
这是MainActiviy代码。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final ListView myListView = (ListView) findViewById(R.id.myListView);
final EditText myEditText = (EditText) findViewById(R.id.myEditText);
final ImageButton myAddButton = (ImageButton) findViewById(R.id.myAddButton);
final ImageButton myDelButton = (ImageButton) findViewById(R.id.myDelButton);
final ImageButton myCanButton = (ImageButton) findViewById(R.id.myCanButton);
final ArrayList<String> toDoItems = new ArrayList<String>();
int resId = R.layout.activity_main;
final ArrayAdapter<String> aa;
aa = new ArrayAdapter<String>(this, resId, toDoItems);
myEditText.setText("");
myListView.setAdapter(aa);
myListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
boolean result = getItemRecord(myListView, position);
if (result)
myListView.removeViewAt(position);
}
});
myAddButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
toDoItems.add(0, myEditText.getText().toString());
aa.notifyDataSetChanged();
myEditText.setText("");
}
});
}
带有项目符号的行是唯一已更改的两行。他们涉及使用新课程。当我将它们更改回使用activity_main时,程序运行正常。
以下是TodoListItemView
的代码 public class TodoListItemView extends AppCompatTextView {
public TodoListItemView(Context context, AttributeSet attributeSet, int ds)
{
super(context, attributeSet, ds);
init();
}
public TodoListItemView(Context context) {
super(context);
init();
}
public TodoListItemView(Context context, AttributeSet attributeSet) {
super(context, attributeSet);
init();
}
private Paint marginPaint;
private Paint linePaint;
private int paperColor;
private float margin;
private void init() {
Resources myResources = getResources();
Context context = getContext();
marginPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
marginPaint.setColor(ContextCompat.getColor(context,
R.color.notepad_margin));
linePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
linePaint.setColor(ContextCompat.getColor(context,
R.color.notepad_lines));
paperColor = ContextCompat.getColor(context, R.color.notepad_paper);
margin = myResources.getDimension(R.dimen.notepad_margin);
}
@Override
public void onDraw(Canvas canvas) {
canvas.drawColor(paperColor);
canvas.drawLine(0, 0, getMeasuredHeight(), 0, linePaint);
canvas.drawLine(0, getMeasuredHeight(), getMeasuredWidth(), getMeasuredHeight(), linePaint);
canvas.drawLine(margin, 0, margin, getMeasuredHeight(), marginPaint);
canvas.save();
canvas.translate(margin, 0);
super.onDraw(canvas);
canvas.restore();
}
}
我觉得它与带子弹的行中的getColor方法有关。本书使用了弃用版本getColor(int),因此我将其替换为ContextCompat。代码构建但应用程序在被送到模拟器后不久就停止了。
这是styles.xml
<resources>
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
<style name="ToDoTheme" parent="@android:style/Theme.Black">
<item name="android:textSize">12sp</item>
</style>
带有星号的行(应该是粗体)定义自定义主题
与往常一样,非常感谢帮助。
答案 0 :(得分:0)
您收到以下错误:
java.lang.ClassCastException:android.widget.LinearLayout无法强制转换为android.widget.TextView
这种情况正在发生,因为您正在将ArrayAdapter的资源设置为R.layout.activity_main,这是一个LinearLayout。要使用TodoListItemView填充ListView,您必须简单地创建一个包含TodoListItemView的布局文件。例如:
todo_list_item_view.xml
<?xml version="1.0" encoding="utf-8"?>
<com.example.test.TodoListItemView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
在你的onCreate方法中:
int resId = R.layout.todo_list_item_view;
我希望这可以解决您的问题。