11

用戶點擊這帶來了其膨脹這樣的片段的片段對話的按鈕:片段在片段對話框充氣拋出錯誤「片段沒有創建視圖」

AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 

     View view = getActivity().getLayoutInflater().inflate(
       R.layout.monday_fragment, null); 
     builder.setView(view).setTitle("Homework Due Monday") 
       .setNegativeButton("Dismiss", null); 

     AlertDialog dialog = builder.create(); 
     dialog.show(); 

這裏是佈局的XML指定(monday_fragment.xml)其中所述片段的引用被充氣在於:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/container" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context=".MainActivity" 
    > 

    <fragment 
     android:id="@+id/monday_fragment" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:name="com.bernard.beaconportal.activities.schedule.daydialogfragments.MondayFragment" 
     android:layout_centerHorizontal="true"/> 

</RelativeLayout> 

在片段對話框中的片段然後在膨脹其OnCreateView自己的佈局:

@Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 

     swipe = inflater.inflate(R.layout.day_homework_fragment, container, 
       false); 

     lView = (ListView) swipe.findViewById(R.id.listView1); 

     progress = (ProgressBar) swipe.findViewById(R.id.progress); 

     lView.setVisibility(View.GONE); 

     return swipe; 

    } 

這裏是在該片段中誇大了「day_homework_fragment.xml」佈局:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" 
    android:layout_gravity="center" 
    android:background="@color/light_background"> 

    <ProgressBar 
     android:id="@+id/progress" 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     android:layout_gravity="center" /> 

    <ListView 
     android:id="@+id/listView1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentBottom="true" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentRight="true" 
     android:layout_alignParentTop="true" 
     android:background="#ffffff" 
     android:divider="@null" 
     android:dividerHeight="0dp" 
     > 
    </ListView> 

      <TextView 
      android:id="@+id/emptyView" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:text="As of now, no homework due this day" 
      android:padding="30dp" 
      android:textSize="16sp"/> 

</LinearLayout> 

這裏是它引發錯誤的日誌,我都試過這個postpost,我也沒有解決了這個問題。

10-11 01:50:40.657 786-786/com.bernard.beaconportal.activities E/AndroidRuntime: FATAL EXCEPTION: main 
    10-11 01:50:40.657 786-786/com.bernard.beaconportal.activities E/AndroidRuntime: Process: com.bernard.beaconportal.activities, PID: 786 
    10-11 01:50:40.657 786-786/com.bernard.beaconportal.activities E/AndroidRuntime: android.view.InflateException: Binary XML file line #10: Error inflating class fragment 
    10-11 01:50:40.657 786-786/com.bernard.beaconportal.activities E/AndroidRuntime:  at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:763) 
    10-11 01:50:40.657 786-786/com.bernard.beaconportal.activities E/AndroidRuntime:  at android.view.LayoutInflater.rInflate(LayoutInflater.java:806) 
    10-11 01:50:40.657 786-786/com.bernard.beaconportal.activities E/AndroidRuntime:  at android.view.LayoutInflater.inflate(LayoutInflater.java:504) 
    10-11 01:50:40.657 786-786/com.bernard.beaconportal.activities E/AndroidRuntime:  at de.robv.android.xposed.XposedBridge.invokeOriginalMethodNative(Native Method) 
    10-11 01:50:40.657 786-786/com.bernard.beaconportal.activities E/AndroidRuntime:  at de.robv.android.xposed.XposedBridge.handleHookedMethod(XposedBridge.java:668) 
    10-11 01:50:40.657 786-786/com.bernard.beaconportal.activities E/AndroidRuntime:  at android.view.LayoutInflater.inflate(<Xposed>) 
    10-11 01:50:40.657 786-786/com.bernard.beaconportal.activities E/AndroidRuntime:  at android.view.LayoutInflater.inflate(LayoutInflater.java:414) 
    10-11 01:50:40.657 786-786/com.bernard.beaconportal.activities E/AndroidRuntime:  at android.view.LayoutInflater.inflate(LayoutInflater.java:365) 
    10-11 01:50:40.657 786-786/com.bernard.beaconportal.activities E/AndroidRuntime:  at com.bernard.beaconportal.activities.schedule.view.MondayView.showDialog(MondayView.java:232) 
    10-11 01:50:40.657 786-786/com.bernard.beaconportal.activities E/AndroidRuntime:  at com.bernard.beaconportal.activities.schedule.view.MondayView$1.onClick(MondayView.java:174) 
    10-11 01:50:40.657 786-786/com.bernard.beaconportal.activities E/AndroidRuntime:  at android.view.View.performClick(View.java:4780) 
    10-11 01:50:40.657 786-786/com.bernard.beaconportal.activities E/AndroidRuntime:  at android.view.View$PerformClick.run(View.java:19867) 
    10-11 01:50:40.657 786-786/com.bernard.beaconportal.activities E/AndroidRuntime:  at android.os.Handler.handleCallback(Handler.java:739) 
    10-11 01:50:40.657 786-786/com.bernard.beaconportal.activities E/AndroidRuntime:  at android.os.Handler.dispatchMessage(Handler.java:95) 
    10-11 01:50:40.657 786-786/com.bernard.beaconportal.activities E/AndroidRuntime:  at android.os.Looper.loop(Looper.java:135) 
    10-11 01:50:40.657 786-786/com.bernard.beaconportal.activities E/AndroidRuntime:  at android.app.ActivityThread.main(ActivityThread.java:5338) 
    10-11 01:50:40.657 786-786/com.bernard.beaconportal.activities E/AndroidRuntime:  at java.lang.reflect.Method.invoke(Native Method) 
    10-11 01:50:40.657 786-786/com.bernard.beaconportal.activities E/AndroidRuntime:  at java.lang.reflect.Method.invoke(Method.java:372) 
    10-11 01:50:40.657 786-786/com.bernard.beaconportal.activities E/AndroidRuntime:  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:917) 
    10-11 01:50:40.657 786-786/com.bernard.beaconportal.activities E/AndroidRuntime:  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:704) 
    10-11 01:50:40.657 786-786/com.bernard.beaconportal.activities E/AndroidRuntime:  at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:115) 
    10-11 01:50:40.657 786-786/com.bernard.beaconportal.activities E/AndroidRuntime: Caused by: java.lang.IllegalStateException: Fragment com.bernard.beaconportal.activities.schedule.daydialogfragments.MondayFragment did not create a view. 
    10-11 01:50:40.657 786-786/com.bernard.beaconportal.activities E/AndroidRuntime:  at android.support.v4.app.FragmentManagerImpl.onCreateView(FragmentManager.java:2273) 
    10-11 01:50:40.657 786-786/com.bernard.beaconportal.activities E/AndroidRuntime:  at android.support.v4.app.FragmentController.onCreateView(FragmentController.java:111) 
    10-11 01:50:40.657 786-786/com.bernard.beaconportal.activities E/AndroidRuntime:  at android.support.v4.app.FragmentActivity.dispatchFragmentsOnCreateView(FragmentActivity.java:278) 
    10-11 01:50:40.657 786-786/com.bernard.beaconportal.activities E/AndroidRuntime:  at android.support.v4.app.BaseFragmentActivityDonut.onCreateView(BaseFragmentActivityDonut.java:44) 
    10-11 01:50:40.657 786-786/com.bernard.beaconportal.activities E/AndroidRuntime:  at android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.java:78) 
    10-11 01:50:40.657 786-786/com.bernard.beaconportal.activities E/AndroidRuntime:  at android.support.v7.app.AppCompatDelegateImplV7.callActivityOnCreateView(AppCompatDelegateImplV7.java:842) 
    10-11 01:50:40.657 786-786/com.bernard.beaconportal.activities E/AndroidRuntime:  at android.support.v7.app.AppCompatDelegateImplV11.callActivityOnCreateView(AppCompatDelegateImplV11.java:34) 
    10-11 01:50:40.657 786-786/com.bernard.beaconportal.activities E/AndroidRuntime:  at android.support.v7.app.AppCompatDelegateImplV7.onCreateView(AppCompatDelegateImplV7.java:830) 
    10-11 01:50:40.657 786-786/com.bernard.beaconportal.activities E/AndroidRuntime:  at android.support.v4.view.LayoutInflaterCompatHC$FactoryWrapperHC.onCreateView(LayoutInflaterCompatHC.java:44) 
    10-11 01:50:40.657 786-786/com.bernard.beaconportal.activities E/AndroidRuntime:  at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:725) 
    10-11 01:50:40.657 786-786/com.bernard.beaconportal.activities E/AndroidRuntime:  at android.view.LayoutInflater.rInflate(LayoutInflater.java:806)  
    10-11 01:50:40.657 786-786/com.bernard.beaconportal.activities E/AndroidRuntime:  at android.view.LayoutInflater.inflate(LayoutInflater.java:504)  
    10-11 01:50:40.657 786-786/com.bernard.beaconportal.activities E/AndroidRuntime:  at de.robv.android.xposed.XposedBridge.invokeOriginalMethodNative(Native Method)  
    10-11 01:50:40.657 786-786/com.bernard.beaconportal.activities E/AndroidRuntime:  at de.robv.android.xposed.XposedBridge.handleHookedMethod(XposedBridge.java:668)  
    10-11 01:50:40.657 786-786/com.bernard.beaconportal.activities E/AndroidRuntime:  at android.view.LayoutInflater.inflate(<Xposed>)  
    10-11 01:50:40.657 786-786/com.bernard.beaconportal.activities E/AndroidRuntime:  at android.view.LayoutInflater.inflate(LayoutInflater.java:414)  
    10-11 01:50:40.657 786-786/com.bernard.beaconportal.activities E/AndroidRuntime:  at android.view.LayoutInflater.inflate(LayoutInflater.java:365)  
    10-11 01:50:40.657 786-786/com.bernard.beaconportal.activities E/AndroidRuntime:  at com.bernard.beaconportal.activities.schedule.view.MondayView.showDialog(MondayView.java:232)  
    10-11 01:50:40.657 786-786/com.bernard.beaconportal.activities E/AndroidRuntime:  at com.bernard.beaconportal.activities.schedule.view.MondayView$1.onClick(MondayView.java:174)  
    10-11 01:50:40.657 786-786/com.bernard.beaconportal.activities E/AndroidRuntime:  at android.view.View.performClick(View.java:4780)  
    10-11 01:50:40.657 786-786/com.bernard.beaconportal.activities E/AndroidRuntime:  at android.view.View$PerformClick.run(View.java:19867)  
    10-11 01:50:40.657 786-786/com.bernard.beaconportal.activities E/AndroidRuntime:  at android.os.Handler.handleCallback(Handler.java:739)  
    10-11 01:50:40.657 786-786/com.bernard.beaconportal.activities E/AndroidRuntime:  at android.os.Handler.dispatchMessage(Handler.java:95)  
    10-11 01:50:40.657 786-786/com.bernard.beaconportal.activities E/AndroidRuntime:  at android.os.Looper.loop(Looper.java:135)  
    10-11 01:50:40.657 786-786/com.bernard.beaconportal.activities E/AndroidRuntime:  at android.app.ActivityThread.main(ActivityThread.java:5338)  
    10-11 01:50:40.657 786-786/com.bernard.beaconportal.activities E/AndroidRuntime:  at java.lang.reflect.Method.invoke(Native Method)  
    10-11 01:50:40.657 786-786/com.bernard.beaconportal.activities E/AndroidRuntime:  at java.lang.reflect.Method.invoke(Method.java:372)  
    10-11 01:50:40.657 786-786/com.bernard.beaconportal.activities E/AndroidRuntime:  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:917)  
    10-11 01:50:40.657 786-786/com.bernard.beaconportal.activities E/AndroidRuntime:  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:704)  
    10-11 01:50:40.657 786-786/com.bernard.beaconportal.activities E/AndroidRuntime:  at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:115)  

編輯:我只是意識到,這隻在我從eclipse移動到Android Studio後纔開始發生。也許這跟它有關係?可能所有的片段引用都搞砸了?

+1

你是否爲你的片段調用了'onCreateView'或'onCreate'? – Tauqir

+1

顯示標記到你的'day_homework_fragment.xml'片段 – selbie

+0

@Tauqir我沒叫oncreateview我的片段,它膨脹「day_homework_fragment」 –

回答

3

我覺得這個代碼是犯罪嫌疑人:

View view = getActivity().getLayoutInflater().inflate(
      R.layout.monday_fragment, null); 

inflate,第一個參數是XML文件名,而不是片段ID。也許你想要xml R.layout.day_homework_fragment來代替。

我知道這些ID很混亂。只有像findViewById()這樣的方法指向一個UI ID。

+0

對不起,我應該在我的帖子中更清楚。 「monday_fragment.xml」也是保存對片段的引用的佈局的名稱。我會在我的帖子中更加清楚。 –

+1

澄清monday_fragment沒有引用片段ID,但是引用了xml佈局 –

4

你的日誌點到第10行是指這裏的XML聲明是一個問題,因爲碎片在第10行說的事實:

android:name="com.bernard.beaconportal.activities.schedule.daydialogfragments.MondayFragment" 

我會仔細這裏檢查此引用,看看它是否指向正確的地方,你已經保存了片段的Java類。

此外,檢查你的MondayFragment類,你正在擴展正確的片段類。換句話說,如果您使用支持庫,則需要擴展支持庫Fragment類而不是普通的Fragment類。

如果一切都失敗了,你總是可以以編程方式添加一個片段:http://developer.android.com/training/basics/fragments/fragment-ui.html

編輯:我看到你用下面的代碼目前膨脹你的XML:

View view = getActivity().getLayoutInflater().inflate(
       R.layout.monday_fragment, null); 

既然你無論如何都會在片段內膨脹它,你能不能只說:

View view = inflater.inflate(R.layout.monday_fragment, null, 
       false); 
+0

我確信我有正確的包名,因爲即使IDE可以識別我指向的是正確的片段。此外,我正在使用我的Fragment類的支持庫。 –

+0

嘗試Android Studios上的「文件|無效緩存/重新啓動」。 – Simon

3

兩件事情:

  1. 檢查com.bernard.beaconportal.activities.schedule.daydialogfragments.MondayFragment是正確的軟件包名稱(路徑)

  2. 在你monday_fragment.xml重命名android:id="@+id/monday_fragment"android:id="@+id/monday_fragment1"

    請參見下面的代碼:

    <Fragment 
        android:id="@+id/monday_fragment1" 
        android:layout_width="match_parent" 
        android:layout_height="wrap_content" 
        android:name="com.bernard.beaconportal.activities.schedule.daydialogfragments.MondayFragment" 
        android:layout_centerHorizontal="true"/> 
    
+0

我很確定我有正確的包名,因爲即使IDE認識到我指向正確的片段。此外,我只是嘗試#2,似乎ID不與任何衝突,因爲我得到相同的錯誤。這是一個奇怪的錯誤,我不知道還有什麼可以嘗試的。 –

+0

如果您正在使用Android Studio,則刪除[app module]/build /下的所有子文件夾並重新編譯項目 – penguin

+0

刪除構建文件夾並重新編譯後仍然沒有更改。現在我想到了這一點,只是在我從eclipse轉移到Android Studio後纔開始發生,也許這與它有關。 –

2

我相信你有調試包com.bernard.beaconportal.activities.schedule.daydialogfragments.MondayFragment本身。遷移到Android Studio後,UI參考可能無效。一種簡單的調試方法是在OnCreateView()中刪除代碼。

如果您將包導入爲jar文件,那麼這是一個不同的案例/問題。

+0

@ I'm_With_Stupid,所以...如果你刪除了OnCreateView中的代碼,應用程序是否仍然崩潰? –

4

你不能把片段放在標準AlertDialog內。您必須創建一個DialogFragment實現來將片段添加到對話框中。原因很簡單,因爲標準片段會嘗試將自己附加到相應活動的根窗口,而當根窗口上有單獨的窗口時,情況並非如此。 AlertDialog不能包含DialogFragment或甚至Fragment。嘗試將您的AlertDialog代碼更改爲DialogFragment實施。

+1

我認爲你有一點,所以我upvoted你的答案。我認爲你的建議可能是最好的。但作者開發者可能不想更改太多的代碼。在這種情況下,這可能是一個錯誤。 –

1

爲什麼不使用對話框片段而不使用Alertdialog?它對於在活動範圍內調用某個爭議非常重要。對話框片段將具有所有生命週期方法,並且將有助於創建任何後續片段。

0

通過xml綁定片段通常會帶來負面的微妙後果。動態地做這件事。

改變你的monday_fragment。XML這樣的:

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/container" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    > 

</FrameLayout> 

並更改該塊的代碼:

AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 

View view = getActivity().getLayoutInflater().inflate(
     R.layout.monday_fragment, null); 

builder.setView(view).setTitle("Homework Due Monday") 
     .setNegativeButton("Dismiss", null); 

MondayFragment mondayFragment = new MondayFragment(); 
getFragmentManager().beginTransaction() 
        .replace(R.id.container, mondayFragment) 
        .commit(); 

AlertDialog dialog = builder.create(); 
dialog.show(); 

編輯:如果失敗,嘗試改變

getFragmentManager().beginTransaction() 
     .replace(R.id.container, mondayFragment) 
     .commit(); 

getParentFragment().getChildFragmentManager().beginTransaction() 
      .replace(R.id.container, mondayFragment) 
      .commit(); 

編輯讓我們嘗試DialogFragment

請創建類DayHomeworkDialogFragment:

public class DayHomeworkDialogFragment extends DialogFragment { 

    public DayHomeworkDialogFragment() { 
    } 

    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 


     LayoutInflater inflater = LayoutInflater.from(getActivity()); 
     View swipe = inflater.inflate(R.layout.day_homework_fragment, null); 

     lView = (ListView) swipe.findViewById(R.id.listView1); 
     progress = (ProgressBar) swipe.findViewById(R.id.progress); 
     lView.setVisibility(View.GONE); 



     AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(getActivity()) 
       .setView(swipe) 
       .setTitle("Homework Due Monday") 
       .setPositiveButton("Add", new DialogInterface.OnClickListener() { 
        @Override 
        public void onClick(DialogInterface dialog, int which) { 

        } 
       }) 
       .setNegativeButton("Dismiss", 
         new DialogInterface.OnClickListener() { 
          public void onClick(DialogInterface dialog, int whichButton) { 
           dialog.dismiss(); 
          } 
         } 
       ); 

     return alertDialogBuilder.create(); 
    } 
} 

,而不是這個

AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 

     View view = getActivity().getLayoutInflater().inflate(
       R.layout.monday_fragment, null); 
     builder.setView(view).setTitle("Homework Due Monday") 
       .setNegativeButton("Dismiss", null); 

     AlertDialog dialog = builder.create(); 
     dialog.show(); 

使用,這一點:

FragmentManager fragmentManager = getFragmentManager(); 
DayHomeworkDialogFragment dayHomeworkDialogFragment = new DayHomeworkDialogFragment(); 
dayHomeworkDialogFragment.show(fragmentManager, "my_day_homework_fragment"); 

如果失敗,嘗試使用getCh ildFragmentManager()而不是getFragmentManager()

+0

無論我嘗試什麼,我都會得到這個[error](http://stackoverflow.com/questions/7508044/android-fragment-no-view-found-for-id)。它聲稱R.id.container不存在。我甚至在使用framelayout.getId()引用它之前嘗試啓動FrameLayout。似乎沒有任何工作。 –

+0

甚至getChildFragmentManager()沒有幫助? –

+1

@ I'm_With_Stupid請看我最後的編輯 –