2017-08-01 66 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(""); 
     } 
    }); 
} 

帶項目符號的行是唯一已更改的兩行。他們涉及使用新班級。當我將它們改回到使用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

後登錄好友。 – Salman500

回答

0

你得到以下錯誤:

java.lang.ClassCastException: android.widget.LinearLayout cannot be cast to 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; 

我希望這可以解決您的問題。

+0

我可以在EditText中輸入一個值,但是當我點擊添加按鈕時,它說應用程序已停止。我運行了調試器,它在click事件中指向toDo_items.add語句。我不確定它爲什麼會這樣做,因爲當我切換回舊示例時,應用程序運行良好。 – user182162

+0

順便說一下,感謝您輸入羅馬諾 – user182162

+0

我在應用程序上運行了調試器,並且一旦進入按鈕的步驟,它就會在EditText類中引發異常,並在調試器頂部顯示以下內容: 反編譯。類文件,字節碼版本:52.0(Java 8) 未找到'Android API平臺'的信息來源我檢查了我安裝的SDK和Android 8條目(26.0)說它的部分安裝 – user182162