2014-09-26 35 views
2

我努力學習用書Android應用程序發展論壇傻瓜部分Android編程。本書中的一項任務是創建一個稱爲任務提醒的應用程序,該應用程序引入了Android碎片。據該書以下編碼件應創建第一個簡單的列表視圖:android.view.InflateException - Android應用研究與開發傻瓜

import android.app.ListActivity; 
import android.os.Bundle; 
import android.util.Log; 

public class ReminderListActivity extends ListActivity { 

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.reminder_list);  
    } 

} 

與reminder_list看起來像這樣:

<?xml version="1.0" encoding="utf-8"?> 

<fragment xmlns:android="http://schemas.android.com/apk/res/android" 
    android:name="com.holtkoe.android.birthdaytimer.ReminderListFragment" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" /> 

類ReminderListFragment如下:

import android.os.Bundle; 
import android.support.v4.app.ListFragment; 
import android.widget.ArrayAdapter; 
import android.widget.ListAdapter; 

public class ReminderListFragment extends ListFragment { 

    private ListAdapter mAdapter; 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState){ 
     super.onActivityCreated(savedInstanceState); 

     String[] items = new String[] {"Foo","Bar","Fizz","Bin"}; 

     mAdapter = new ArrayAdapter<String>(getActivity(), R.layout.reminder_row, R.id.text1, items); 
     setListAdapter(mAdapter); 

    } 
    } 

最後reminder_row:

<?xml version="1.0" encoding="utf-8"?> 
<TextView 
    android:id="@+id/text1" 
    xmlns:android="http://schemas.android.com/apk/res/android"  
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:padding="10dp"/> 

我想這兩個仿真設備,並在我的智能手機上運行這一點,但總是能得到以下

09-26 22:44:53.270: D/AndroidRuntime(2493): Shutting down VM 
09-26 22:44:53.270: W/dalvikvm(2493): threadid=1: thread exiting with uncaught exception (group=0x412d8930) 
09-26 22:44:53.290: E/AndroidRuntime(2493): FATAL EXCEPTION: main 
09-26 22:44:53.290: E/AndroidRuntime(2493): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.holtkoe.android.birthdaytimer/com.holtkoe.android.birthdaytimer.ReminderListActivity}: android.view.InflateException: Binary XML file line #3: Error inflating class fragment 
09-26 22:44:53.290: E/AndroidRuntime(2493):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2245) 
09-26 22:44:53.290: E/AndroidRuntime(2493):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2299) 
09-26 22:44:53.290: E/AndroidRuntime(2493):  at android.app.ActivityThread.access$700(ActivityThread.java:150) 
09-26 22:44:53.290: E/AndroidRuntime(2493):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1280) 
09-26 22:44:53.290: E/AndroidRuntime(2493):  at android.os.Handler.dispatchMessage(Handler.java:99) 
09-26 22:44:53.290: E/AndroidRuntime(2493):  at android.os.Looper.loop(Looper.java:137) 
09-26 22:44:53.290: E/AndroidRuntime(2493):  at android.app.ActivityThread.main(ActivityThread.java:5283) 
09-26 22:44:53.290: E/AndroidRuntime(2493):  at java.lang.reflect.Method.invokeNative(Native Method) 
09-26 22:44:53.290: E/AndroidRuntime(2493):  at java.lang.reflect.Method.invoke(Method.java:511) 
09-26 22:44:53.290: E/AndroidRuntime(2493):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102) 
09-26 22:44:53.290: E/AndroidRuntime(2493):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869) 
09-26 22:44:53.290: E/AndroidRuntime(2493):  at dalvik.system.NativeStart.main(Native Method) 
09-26 22:44:53.290: E/AndroidRuntime(2493): Caused by: android.view.InflateException: Binary XML file line #3: Error inflating class fragment 
09-26 22:44:53.290: E/AndroidRuntime(2493):  at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:710) 
09-26 22:44:53.290: E/AndroidRuntime(2493):  at android.view.LayoutInflater.inflate(LayoutInflater.java:467) 
09-26 22:44:53.290: E/AndroidRuntime(2493):  at android.view.LayoutInflater.inflate(LayoutInflater.java:397) 
09-26 22:44:53.290: E/AndroidRuntime(2493):  at android.view.LayoutInflater.inflate(LayoutInflater.java:353) 
09-26 22:44:53.290: E/AndroidRuntime(2493):  at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:364) 
09-26 22:44:53.290: E/AndroidRuntime(2493):  at android.app.Activity.setContentView(Activity.java:1930) 
09-26 22:44:53.290: E/AndroidRuntime(2493):  at com.holtkoe.android.birthdaytimer.ReminderListActivity.onCreate(ReminderListActivity.java:14) 
09-26 22:44:53.290: E/AndroidRuntime(2493):  at android.app.Activity.performCreate(Activity.java:5283) 
09-26 22:44:53.290: E/AndroidRuntime(2493):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1097) 
09-26 22:44:53.290: E/AndroidRuntime(2493):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2209) 
09-26 22:44:53.290: E/AndroidRuntime(2493):  ... 11 more 
09-26 22:44:53.290: E/AndroidRuntime(2493): Caused by: android.app.Fragment$InstantiationException: Trying to instantiate a class com.holtkoe.android.birthdaytimer.ReminderListFragment that is not a Fragment 
09-26 22:44:53.290: E/AndroidRuntime(2493):  at android.app.Fragment.instantiate(Fragment.java:584) 
09-26 22:44:53.290: E/AndroidRuntime(2493):  at android.app.Fragment.instantiate(Fragment.java:560) 
09-26 22:44:53.290: E/AndroidRuntime(2493):  at android.app.Activity.onCreateView(Activity.java:4864) 
09-26 22:44:53.290: E/AndroidRuntime(2493):  at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:686) 
09-26 22:44:53.290: E/AndroidRuntime(2493):  ... 20 more 
09-26 22:44:53.290: E/AndroidRuntime(2493): Caused by: java.lang.ClassCastException 
09-26 22:44:53.290: E/AndroidRuntime(2493):  ... 24 more 

說實話,我很失落(顯然甚至不是一個虛擬)......我讀了Android碎片的開發人員參考,這裏給出的例子看起來與書中所寫的很相似,但由於某些原因,存在通貨膨脹問題。

我的任何幫助,非常感謝!多謝你們!

回答

2

我認爲你缺少的onCreateView方法誇大你的看法。你仍然需要在你的片段中膨脹一個視圖。

import android.os.Bundle; 
import android.support.v4.app.ListFragment; 
import android.widget.ArrayAdapter; 
import android.widget.ListAdapter; 

public class ReminderListFragment extends ListFragment { 
    private ListAdapter mAdapter; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
     // Inflate the layout for this fragment 
     return inflater.inflate(R.layout.reminder_list, container, false); 
    } 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState){ 
     super.onActivityCreated(savedInstanceState); 

     String[] items = new String[] {"Foo","Bar","Fizz","Bin"}; 

     mAdapter = new ArrayAdapter<String>(getActivity(), R.layout.reminder_row, 
              R.id.text1, items); 
     setListAdapter(mAdapter); 

    } 
} 

編輯:

這裏是另一回事,你可以試試,比如你給了我,在XML片段是一個框架佈局裏,你可以嘗試改變你的XML看起來是這樣的:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" android:layout_height="match_parent"> 

    <fragment xmlns:android="http://schemas.android.com/apk/res/android" 
     android:name="com.holtkoe.android.birthdaytimer.ReminderListFragment" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" /> 

</FrameLayout> 

嘗試與不onCreateView看到他們的行爲的所有選項,以及如何。

+0

嘿,非常感謝您的建議!我在代碼中加入了inflater部分,並試圖再次運行它,但不幸的是,我又收到了一個有限的豁免。在[鏈接](http://developer.android.com/reference/android/app/Fragment.html)下給出的示例中,也沒有包含代碼,但我還沒有弄清楚本質上的區別書中的代碼...你有什麼想法嗎? – Sauerkraut 2014-09-27 20:12:45

+0

用新選項編輯我的答案。 – 2014-09-29 12:40:35

+1

再次感謝您的幫助,非常感謝。我嘗試了一些不同的佈局,但不幸的是它沒有工作。我認爲拉爾託指出了正確的方向。 – Sauerkraut 2014-10-03 17:35:59

0

不能混合平臺片段(android.app.Fragment關係等)以及支持庫片段(android.support.v4.app.Fragment)。

如果您打算使用<fragment>標記對支持庫碎片進行膨脹,則您的活動應擴展支持庫FragmentActivity而不是例如。 ListActivity

+0

感謝您的回答,它最終幫助我解決了問題......儘管這是偶然的,因爲我還沒有完全理解混合支持庫和平臺的問題,但對我的「虛擬「級別。 – Sauerkraut 2014-10-03 17:17:08

0

起初,我改變了片段標籤來基於我所瞭解使用fragmentlist在開發者的資源......至少我沒有遇到任何豁免,但尚未顯示的列表項的列表視圖標籤。我嘗試了對textview佈局的一些更改,但最終放棄了這一點。然後我在網上找到了一個簡單的listfragment示例,它只做了地址API級別14,所以我只是用它作爲最小級別並相應地調整了代碼(從頭開始,因爲我弄亂了以前的代碼)。顯然,不需要支持庫,它可以正常工作。所以,我只會繼續在這個API級別,並會嘗試得到更低的水平運行,一旦我更有經驗;-)

這是現在的工作代碼:

package de.holtkoe.birthdayreminder; 

import android.app.Activity; 
import android.os.Bundle; 


public class ReminderListActivity extends Activity { 

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

} 

佈局資源reminder_list:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <fragment 
     android:id="@+id/fragment" 
     android:name="de.holtkoe.birthdayreminder.ReminderListFragment" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent"/> 


</LinearLayout> 

片段活動再次是ReminderListFragment:

package de.holtkoe.birthdayreminder; 

import android.app.ListFragment; 
import android.os.Bundle; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.ListAdapter; 

public class ReminderListFragment extends ListFragment { 

    private ListAdapter mAdapter; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle  savedInstanceState){ 
     super.onCreate(savedInstanceState); 

     String[] items = new String[] {"Foo","Bar","Fizz","Bin"}; 

     mAdapter = new ArrayAdapter<String>(inflater.getContext(), R.layout.reminder_row, items); 
     setListAdapter(mAdapter); 

     return super.onCreateView(inflater, container, savedInstanceState); 
    } 
} 

最後reminder_row保持不變。