私は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("");
}
});
}
箇条書きの行は、変更された唯一の2行です。彼らは新しいクラスの使用を伴います。私がactivity_mainを使用してそれらを変更すると、プログラムは正常に動作します。ここで
は、私はそれが弾丸とラインでGETCOLOR方法に関係している感覚を持っている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(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>
で、ヘルプは大歓迎です。あなたがのLinearLayoutあるR.layout.activity_mainにArrayAdapterのためのリソースを、設定されているので、これが起こっている
java.lang.ClassCastException: android.widget.LinearLayout cannot be cast to android.widget.TextView
:
投稿ログバディ。 – Salman500