2017-08-01 16 views
0

私は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

+0

投稿ログバディ。 – Salman500

答えて

0

次のエラーを取得しています。 ListViewにTodoListItemViewを設定するには、単に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; 

私は、これはあなたの問題を解決したいと考えています。

+0

私はEditTextに値を入力することができますが、追加ボタンを押すと、アプリケーションが停止したと表示されます。私はデバッガを実行し、clickイベントのtoDo_items.addステートメントを指しています。私はそれがなぜこれを行うのか分からない、私は古い例に戻ったとき、アプリは正常に実行されます。 – user182162

+0

ところで、入力Romanoのおかげで – user182162

+0

私はアプリ上でデバッガを走らせました。ちょうどボタンにステップを叩くとすぐにEditTextクラスに例外がスローされ、デバッガの上部で次のようになります。 逆コンパイル。クラスファイル、バイトコードバージョン:52.0(Java 8) 「Android API Platform」のソースが見つかりません。インストールされているSDKを確認しましたが、Android 8(26.0) – user182162

関連する問題