2013-08-19 64 views
12

MyFragment.java片段沒有創建一個視圖

public class MyFragment extends Fragment { 
    private onItemSelectedListener listener; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.fragment, container, 
       false); 
     btn_myButton = (Button) view.findViewById(R.id.btn_new_client); 
     btn_myButton .setOnClickListener(new OnClickListener() { 

      public void onClick(View v) { 
       updateDetail("New Layout"); 
      } 
     }); 
     return view; 
    } 

    Button btn_myButton; 

    public interface onItemSelectedListener { 
     public void onItemSelected(String link); 
    } 

    @Override 
    public void onAttach(Activity activity) { 
     super.onAttach(activity); 
     if (activity instanceof onItemSelectedListener) { 
      listener = (onItemSelectedListener) activity; 
     } else { 
      throw new ClassCastException(activity.toString() 
        + " must implemenet OnItemSelectedListener"); 
     } 
    } 
    public void updateDetail(String s) { 
     listener.onItemSelected(s); 
    } 
} 

MainActivity.java

public class MainActivity extends Activity implements 
    onItemSelectedListener { 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    setContentView(R.layout.main_activity); 
    super.onCreate(savedInstanceState); 
} 

public void onItemSelected(String link) { 
    FragmentManager manager = getFragmentManager(); 
    FragmentTransaction transaction = manager.beginTransaction(); 
    Fragment fragment; 
    if ("New Layout".equals(link)) { 
     fragment = new Fragment1(); 
     transaction.replace(R.id.detailFragment, fragment); 
     transaction.commit(); 
    } 
} 
} 

Fragment1.java

public class Fragment1 extends Fragment { 

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

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

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" > 

    <Button 
     android:id="@+id/btn_new_client" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:ems="8" 
     android:gravity="center|center_vertical" 
     android:padding="2dp" 
     android:text="@string/new_client" 
     android:textColor="#FFFFFF" > 
    </Button> 

</LinearLayout> 

main_activity.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:background="#4B6C9E" 
    android:baselineAligned="false" 
    android:orientation="horizontal" > 

    <fragment   
     android:id="@+id/FragmentId" 
     android:layout_width="0dp" 
     android:layout_height="match_parent" 
     android:layout_weight="1" 
     class="com.examples.MyProject.MyFragment" > 
    </fragment> 
    <FrameLayout 
     android:id="@+id/detailFragment" 
     android:layout_width="0dp" 
     android:layout_height="match_parent" 
     android:layout_weight="2" > 
    </FrameLayout> 

</LinearLayout> 

logcat的錯誤:

FATAL EXCEPTION: main 
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.elintsys.iCaseDiary/com.examples.MyProject.MainActivity}: android.view.InflateException: Binary XML file line #8: Error inflating class fragment 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1956) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981) 
    at android.app.ActivityThread.access$600(ActivityThread.java:123) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147) 
    at android.os.Handler.dispatchMessage(Handler.java:99) 
    at android.os.Looper.loop(Looper.java:137) 
    at android.app.ActivityThread.main(ActivityThread.java:4424) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:511) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
    at dalvik.system.NativeStart.main(Native Method) 
Caused by: android.view.InflateException: Binary XML file line #8: Error inflating class fragment 
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:697) 
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:739) 
    at android.view.LayoutInflater.inflate(LayoutInflater.java:489) 
    at android.view.LayoutInflater.inflate(LayoutInflater.java:396) 
    at android.view.LayoutInflater.inflate(LayoutInflater.java:352) 
    at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:251) 
    at android.app.Activity.setContentView(Activity.java:1862) 
    at com.examples.MyProject.MainActivity.onCreate(CaseEntryActivity.java:15) 
    at android.app.Activity.performCreate(Activity.java:4492) 
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049) 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920) 
    ... 11 more 
Caused by: java.lang.IllegalStateException: Fragment com.elintsys.iCaseDiary.CaseEntryFragment did not create a view. 
    at android.app.Activity.onCreateView(Activity.java:4293) 
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:673) 
    ... 21 more 
Sending signal. PID: 16275 SIG: 9 

請幫助我的朋友。

+0

你需要反轉這個'setContentView(R.layout.main_activity); super.onCreate(savedInstanceState)'。調用超級,然後setContentView – Raghunandan

回答

17

你需要扭轉這樣的:

setContentView(R.layout.main_activity); 
super.onCreate(savedInstanceState). 

到這一點:

super.onCreate(savedInstanceState). 
setContentView(R.layout.main_activity); 

在活動的onCreate

+0

任何想法,爲什麼會這樣?我總是將super.onCreate(savedInstanceState)作爲我的Activities'onCreate中的最後一個語句。 –

+0

@Mark https://groups.google.com/forum/#!msg/android-developers/wGt4qiwLy3Y/BwRGmRgDX08J這裏還有一個http://stackoverflow.com/questions/7191109/difference-between-code-before-和後超。看@戴安哈克博恩的評論 – Raghunandan

+0

爲我解決了,謝謝! – winnicki

2

即使我在super.onCreate之後調用setContentView,我也遇到了這個錯誤。在我來說,我是建立在我的超類的onCreate方法工人片段,這是正的setContentView之前調用並觸發錯誤記錄在這裏:

https://code.google.com/p/android/issues/detail?id=22564

我不得不給工人片段的初始化進入在活動生命週期中稍後調用一個單獨的方法來解決此問題。

按要求,這裏是代碼如下所示:

public class BaseActivity extends ActionBarActivity { 

    private static final String TAG_TASK_FRAGMENT = "task_fragment"; 

    protected TaskFragment taskFragment; // Used to hold a reference to the active activity between config changes 

    protected void setupTaskFragment() { 
     // It would be great if we could just do this in onCreate, but setting up the task fragment 
     // before calling setContentView() triggers the bug described here: 
     // 
     // https://code.google.com/p/android/issues/detail?id=22564 
     // 
     // So we just need to make sure Activities that run async tasks call this setup function 
     // before they do. 

     FragmentManager fm = getSupportFragmentManager(); 
     taskFragment = (TaskFragment) fm.findFragmentByTag(TAG_TASK_FRAGMENT); 

     // If the Fragment is non-null, then it is currently being 
     // retained across a configuration change. 
     if (taskFragment == null) { 
      taskFragment = new TaskFragment(); 
      fm.beginTransaction().add(taskFragment, TAG_TASK_FRAGMENT).commit(); 
      fm.executePendingTransactions(); 
     } 

    } 

} 

public class ChildActivity extends BaseActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); // If this call adds a fragment, you will have problems 
     setContentView(R.layout.activity_child); 
     setupTaskFragment(); // So we have to add our task fragment here, after we've called setContentView() 

     // further initialization here 
    } 

} 

/** 
* 
* TaskFragment 
* 
* We use this fragment to manage async tasks between configuration changes. The fragment calls 
* setRetainInstance(true) in its constructor, which makes it so that it will not be recreated 
* between configuration events (like screen rotation). Async tasks running from the fragment 
* can then be kept up to date on which activity they belong to. 
*/ 

public class TaskFragment extends Fragment { 

    private ArrayList<AsyncTask> asyncTasks = new ArrayList<AsyncTask>(); 

    public TaskFragment() { 
     super(); 
     setRetainInstance(true); 
    } 

    public void addTask(AsyncTask task) { 
     asyncTasks.add(task); 
    } 

    public void removeTask(AsyncTask task) { 
     asyncTasks.remove(task); 
    } 

    public Application getApplication() { 
     Activity activity = getActivity(); 
     if (activity != null) 
      return activity.getApplication(); 
     else 
      return null; 
    } 

    @Override 
    public void onAttach(Activity activity) { 
     super.onAttach(activity); 
     for (AsyncTask task : asyncTasks) { 
      task.onAttach(activity); 
     } 
    } 

    @Override 
    public void onDetach() { 
     super.onDetach(); 
     for (AsyncTask task : asyncTasks) { 
      task.onDetach(); 
     } 
    } 
} 
+0

你可以提供你如何做這個代碼示例 – diegoaguilar

+0

我已經添加了一個代碼示例,顯示了我必須做的事情。 –

0

除了什麼梅爾·斯坦利說,你還需要確保你的機器人添加:標記你的XML活動,其中片段是加載:

<fragment 
android:id="@+id/fragment_container" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:name="com.your_app.name.fragments.NameOfFragment" 
android:tag="fragment_tag" 
tools:layout="@layout/layout_fragment" 
/> 

這可確保當使用xml第一次加載片段時,不會使用Mel的代碼重新加載片段。如果您遺漏了這部分內容,則首次運行時會有2次加載碎片 - 如果您有完成時更改佈局的異步請求,則會出現問題。

相關問題