2015-08-27 64 views
-1

我正在嘗試使用listview和listview適配器實現一個待辦事項列表,但已遇到幾個我無法克服的運行時異常。 Logcat說我正試圖在空對象引用上調用findViewById(第24行= private Spinner spinner_priority;)。但是,微調器的id是spinnerPriority和findViewById(R.id.spinnerPriority)被正確調用。Android的錯誤 - 二進制XML文件行#1:錯誤膨脹類片段

我沒有更改默認的ToDoActivity.java實現,除了從FragmentActivity而不是從AppCombatActivity擴展ToDoActivity並導入android.support.v4.app.FragmentActivity而不是android.app.FragmentActivity。

關於爲什麼應用程序崩潰的任何見解?

logcat的:

08-27 00:45:58.209 11873-11873/? E/AndroidRuntime﹕ FATAL EXCEPTION: main 
    Process: com.ttse.final_tse, PID: 11873 
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.ttse.final_tse/com.ttse.final_tse.ToDoActivity}: android.view.InflateException: Binary XML file line #1: Error inflating class fragment 
      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2325) 
      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387) 
      at android.app.ActivityThread.access$800(ActivityThread.java:151) 
      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303) 
      at android.os.Handler.dispatchMessage(Handler.java:102) 
      at android.os.Looper.loop(Looper.java:135) 
      at android.app.ActivityThread.main(ActivityThread.java:5254) 
      at java.lang.reflect.Method.invoke(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:372) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 
    Caused by: android.view.InflateException: Binary XML file line #1: Error inflating class fragment 
      at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:763) 
      at android.view.LayoutInflater.inflate(LayoutInflater.java:482) 
      at android.view.LayoutInflater.inflate(LayoutInflater.java:414) 
      at android.view.LayoutInflater.inflate(LayoutInflater.java:365) 
      at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:378) 
      at android.app.Activity.setContentView(Activity.java:2145) 
      at com.ttse.final_tse.ToDoActivity.onCreate(ToDoActivity.java:14) 
      at android.app.Activity.performCreate(Activity.java:5990) 
      at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106) 
      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278) 
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387) 
            at android.app.ActivityThread.access$800(ActivityThread.java:151) 
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303) 
            at android.os.Handler.dispatchMessage(Handler.java:102) 
            at android.os.Looper.loop(Looper.java:135) 
            at android.app.ActivityThread.main(ActivityThread.java:5254) 
            at java.lang.reflect.Method.invoke(Native Method) 
            at java.lang.reflect.Method.invoke(Method.java:372) 
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 
    Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.support.v4.app.FragmentActivity.findViewById(int)' on a null object reference 
      at com.ttse.final_tse.ToDoActivityFragment.<init>(ToDoActivityFragment.java:24) 
      at java.lang.reflect.Constructor.newInstance(Native Method) 
      at java.lang.Class.newInstance(Class.java:1606) 
      at android.support.v4.app.Fragment.instantiate(Fragment.java:421) 
      at android.support.v4.app.Fragment.instantiate(Fragment.java:396) 
      at android.support.v4.app.FragmentManagerImpl.onCreateView(FragmentManager.java:2162) 
      at android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.java:300) 
      at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:727) 
            at android.view.LayoutInflater.inflate(LayoutInflater.java:482) 
            at android.view.LayoutInflater.inflate(LayoutInflater.java:414) 
            at android.view.LayoutInflater.inflate(LayoutInflater.java:365) 
            at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:378) 
            at android.app.Activity.setContentView(Activity.java:2145) 
            at com.ttse.final_tse.ToDoActivity.onCreate(ToDoActivity.java:14) 
            at android.app.Activity.performCreate(Activity.java:5990) 
            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106) 
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278) 
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387) 
            at android.app.ActivityThread.access$800(ActivityThread.java:151) 
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303) 
            at android.os.Handler.dispatchMessage(Handler.java:102) 
            at android.os.Looper.loop(Looper.java:135) 
            at android.app.ActivityThread.main(ActivityThread.java:5254) 
            at java.lang.reflect.Method.invoke(Native Method) 
            at java.lang.reflect.Method.invoke(Method.java:372) 
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 

ToDoActivity.java

package com.ttse.final_tse; 

import android.support.v4.app.FragmentActivity; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.Menu; 
import android.view.MenuItem; 

public class ToDoActivity extends FragmentActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_to_do); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.menu_to_do, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 
     int id = item.getItemId(); 

     //noinspection SimplifiableIfStatement 
     if (id == R.id.action_settings) { 
      return true; 
     } 

     return super.onOptionsItemSelected(item); 
    } 
} 

activity_to_do.xml

<fragment xmlns:android="http://schemas.android.com/apk/res/android" 
      xmlns:tools="http://schemas.android.com/tools" 
      android:id="@+id/fragment" 
      android:name="com.ttse.final_tse.ToDoActivityFragment" 
      tools:layout="@layout/fragment_to_do" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent"/> 

ToDoActivityFragment.java

package com.ttse.final_tse; 

import android.app.DialogFragment; 
import android.support.v4.app.Fragment; 
import android.os.Bundle; 
import android.text.TextUtils; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.AdapterView; 
import android.widget.ArrayAdapter; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.ListView; 
import android.widget.Spinner; 
import android.widget.TextView; 
import android.widget.Toast; 
import java.util.ArrayList; 
import java.util.List; 

public class ToDoActivityFragment extends Fragment { 
    private List<Task> list_tasks = new ArrayList<Task>(); 
    private ArrayAdapter<Task> list_adapter = null; 
    private final EditText editText_title = (EditText)getActivity().findViewById(R.id.editTextTitle); 
    private Spinner spinner_priority; 
    private Button button_datepicker; 
    private final TextView textView_date = (TextView)getActivity().findViewById(R.id.textViewDate); 
    private EditText editText_shortDescr; 
    private Button button_save; 

    public ToDoActivityFragment() { 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     return inflater.inflate(R.layout.fragment_to_do, container, false); 
    } 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 
     // To-Do ListView 
     ListView list = (ListView)getActivity().findViewById(R.id.listViewToDo); 
     list_adapter = new ArrayAdapter<Task>(getActivity(), android.R.layout.simple_list_item_1, list_tasks); 
     list.setAdapter(list_adapter); 

     // Priority Spinner 
     spinner_priority = (Spinner)getActivity().findViewById(R.id.spinnerPriority); 
     ArrayAdapter<CharSequence> spinner_adapter = ArrayAdapter.createFromResource(getActivity(), R.array.priority_array, android.R.layout.simple_spinner_item); 
     spinner_adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
     spinner_priority.setAdapter(spinner_adapter); 

     spinner_priority.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 
      @Override 
      public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { 
      } 

      @Override 
      public void onNothingSelected(AdapterView<?> parent) { 

      } 
     }); 

     // Datepicker Button 
     button_datepicker = (Button)getActivity().findViewById(R.id.buttonDatepicker); 
     button_datepicker.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       showDatePickerDialog(v); 
      } 
     }); 

     // Short Description EditText 
     editText_shortDescr = (EditText)getActivity().findViewById(R.id.editTextShortDescr); 

     // Save Button 
     button_save = (Button)getActivity().findViewById(R.id.buttonSave); 
     button_save.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       if(TextUtils.isEmpty(editText_title.getText()) || TextUtils.isEmpty(textView_date.getText())) { 
        Toast.makeText(getActivity(), "Please set to-do title and due date", Toast.LENGTH_SHORT).show(); 
        return; 
       } 
       onSave(); 
      } 
     }); 
    } 

    private void showDatePickerDialog(View v) { 
     DialogFragment date_picker = new DatePickerFragment(); 
     // show datepicker fragment on screen 
     date_picker.show(getActivity().getFragmentManager(), "datePicker"); 
    } 

    private void onSave() { 
     Task task = new Task(); 
     task.setTitle(editText_title.getText().toString()); 
     task.setPriority(spinner_priority.getSelectedItem().toString()); 
     task.setDueDate(textView_date.getText().toString()); 
     task.setShortDescr(editText_shortDescr.getText().toString()); 
     list_adapter.add(task); 
     list_adapter.notifyDataSetChanged(); 
    } 
} 

fragment_to_do.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       xmlns:tools="http://schemas.android.com/tools" 
       android:orientation="vertical" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:paddingLeft="@dimen/activity_horizontal_margin" 
       android:paddingRight="@dimen/activity_horizontal_margin" 
       android:paddingTop="@dimen/activity_vertical_margin" 
       android:paddingBottom="@dimen/activity_vertical_margin" 
       tools:context=".ToDoActivityFragment"> 
    <ListView 
     android:id="@+id/listViewToDo" 
     android:layout_width="match_parent" 
     android:layout_height="0dp" 
     android:layout_weight="10"> 

    </ListView> 
    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="0dp" 
     android:orientation="vertical" 
     android:layout_weight="7"> 
     <EditText 
      android:id="@+id/editTextTitle" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:hint="Title..."/> 
     <LinearLayout 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:orientation="horizontal"> 
      <TextView 
       android:layout_width="0dp" 
       android:layout_height="wrap_content" 
       android:layout_weight="3" 
       android:text="Priority Level:" 
       android:layout_marginTop="5dp"/> 
      <Spinner 
       android:id="@+id/spinnerPriority" 
       android:layout_width="0dp" 
       android:layout_height="wrap_content" 
       android:layout_weight="4" 
       android:spinnerMode="dropdown" 
       android:layout_marginTop="5dp"/> 
      <LinearLayout 
       android:layout_width="0dp" 
       android:layout_height="wrap_content" 
       android:layout_weight="4" 
       android:orientation="vertical"> 
       <Button 
        android:id="@+id/buttonDatepicker" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:layout_gravity="center" 
        android:text="@string/pick_date"/> 
       <TextView 
        android:id="@+id/textViewDate" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:layout_gravity="center"/> 
      </LinearLayout> 
     </LinearLayout> 
     <EditText 
      android:id="@+id/editTextShortDescr" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:hint="Short description..." 
      android:textSize="14sp"/> 
     <Button 
      android:id="@+id/buttonSave" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="@string/text_save" 
      android:layout_gravity="center"/> 
    </LinearLayout> 
</LinearLayout> 

DatePickerFragment.java

package com.ttse.final_tse; 

import android.app.DatePickerDialog; 
import android.app.Dialog; 
import android.app.DialogFragment; 
import android.os.Bundle; 
import android.widget.DatePicker; 
import android.widget.TextView; 
import java.util.Calendar; 

public class DatePickerFragment extends DialogFragment 
     implements DatePickerDialog.OnDateSetListener { 

    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     final Calendar c = Calendar.getInstance(); 
     int year = c.get(Calendar.YEAR); 
     int month = c.get(Calendar.MONTH); 
     int day = c.get(Calendar.DAY_OF_MONTH); 
     return new DatePickerDialog(getActivity(), this, year, month, day); 
    } 

    public void onDateSet(DatePicker view, int year, int month, int day) { 
     TextView textView_date = (TextView)getActivity().findViewById(R.id.textViewDate); 
     textView_date.setText(new StringBuilder() 
       .append(month + 1).append("/").append(day).append("/") 
       .append(year)); 
    } 
} 

Task.java

package com.ttse.final_tse; 

public class Task { 
    private String mTitle; 
    private String mDueDate; 
    private String mPriority; 
    private String mShortDescr; 

    public String getTitle() { 
     return mTitle; 
    } 

    public void setTitle(String title) { 
     mTitle = title; 
    } 

    public String getDueDate() { 
     return mDueDate; 
    } 

    public void setDueDate(String dueDate) { 
     mDueDate = dueDate; 
    } 

    public String getPriority() { 
     return mPriority; 
    } 

    public void setPriority(String priority) { 
     mPriority = priority; 
    } 

    public String getShortDescr() { 
     return mShortDescr; 
    } 

    public void setShortDescr(String shortDescr) { 
     mShortDescr = shortDescr; 
    } 
} 
+0

檢查這存在一個com.ttse.final_tse/com.ttse.final_tse.ToDoActivity –

+0

是它存在下com.ttse.final_tse/ToDoActivity.java – estmit

+0

替換getactivity()。findViewById到getView ().findViewById。 –

回答

1

更新你這樣的代碼

private EditText editText_title ; 
private TextView textView_date ; 

在onActivityCreated初始化

@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 
    // To-Do ListView 
    editText_title =  (EditText)getActivity().findViewById(R.id.editTextTitle); 
    textView_date = (TextView)getActivity().findViewById(R.id.textViewDate); 
+0

是的,早些時候也發現了;在onAcitivityCreated()之外初始化小部件的不好主意。謝謝! – estmit

相關問題