应用自定义主题时应用程序意外停止

时间:2017-08-01 04:15:49

标签: android themes

我正在开发一本关于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>

带有星号的行(应该是粗体)定义自定义主题

与往常一样,非常感谢帮助。

1 个答案:

答案 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;

我希望这可以解决您的问题。