我的應用程序編譯和運行,但崩潰時我嘗試從標籤更改它開始於任何其他選項卡(只有其他的標籤,包含列表)。我搜索了這裏發佈的類似問題,但無法找到可行的解決方案。內容必須具有ListView控件的ID artibute是「android.R.id.list」
整個工程住在https://github.com/BathUniApp/bath-uni-app,如果你需要看到代碼,我沒有在這裏發表或爲ToDoListFragment的全部代碼。以下是最相關的位:
logcat的輸出:
E/AndroidRuntime(15409): FATAL EXCEPTION: main
E/AndroidRuntime(15409): java.lang.RuntimeException: Your content must have a ListView whose id attribute is 'android.R.id.list'
E/AndroidRuntime(15409): at android.support.v4.app.ListFragment.ensureList(ListFragment.java:344)
E/AndroidRuntime(15409): at android.support.v4.app.ListFragment.onViewCreated(ListFragment.java:145)
E/AndroidRuntime(15409): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:941)
E/AndroidRuntime(15409): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1104)
E/AndroidRuntime(15409): at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
E/AndroidRuntime(15409): at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1467)
E/AndroidRuntime(15409): at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:472)
E/AndroidRuntime(15409): at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:141)
E/AndroidRuntime(15409): at android.support.v4.view.ViewPager.populate(ViewPager.java:1068)
E/AndroidRuntime(15409): at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:550)
E/AndroidRuntime(15409): at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:509)
E/AndroidRuntime(15409): at android.support.v4.view.ViewPager.setCurrentItem(ViewPager.java:490)
E/AndroidRuntime(15409): at ip7.bathuniapp.MainActivity.onTabSelected(MainActivity.java:51)
E/AndroidRuntime(15409): at com.android.internal.app.ActionBarImpl.selectTab(ActionBarImpl.java:570)
E/AndroidRuntime(15409): at com.android.internal.app.ActionBarImpl$TabImpl.select(ActionBarImpl.java:1067)
E/AndroidRuntime(15409): at com.android.internal.widget.ScrollingTabContainerView$TabClickListener.onClick(ScrollingTabContainerView.java:489)
E/AndroidRuntime(15409): at android.view.View.performClick(View.java:4106)
E/AndroidRuntime(15409): at android.view.View$PerformClick.run(View.java:17150)
E/AndroidRuntime(15409): at android.os.Handler.handleCallback(Handler.java:615)
E/AndroidRuntime(15409): at android.os.Handler.dispatchMessage(Handler.java:92)
E/AndroidRuntime(15409): at android.os.Looper.loop(Looper.java:137)
E/AndroidRuntime(15409): at android.app.ActivityThread.main(ActivityThread.java:4793)
E/AndroidRuntime(15409): at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime(15409): at java.lang.reflect.Method.invoke(Method.java:511)
E/AndroidRuntime(15409): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:808)
E/AndroidRuntime(15409): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:575)
E/AndroidRuntime(15409): at dalvik.system.NativeStart.main(Native Method)
MainActivity.java:
public class MainActivity extends FragmentActivity implements ActionBar.TabListener {
private NonSwipeableViewPager nsViewPager;
private TabsPagerAdapter tabsAdapter;
private ActionBar actionBar;
private String[] tabs = {"Settings", "Buses", "Classes",
"To-Do list", "Maps" };
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
nsViewPager = (NonSwipeableViewPager) findViewById(R.id.pager);
actionBar = getActionBar();
tabsAdapter = new TabsPagerAdapter(getSupportFragmentManager());
nsViewPager.setAdapter(tabsAdapter);
actionBar.setHomeButtonEnabled(false);
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
//add the tabs
for (String name : tabs) {
actionBar.addTab(actionBar.newTab()
.setText(name)
.setTabListener(this));
}
}
@Override
public void onTabReselected(Tab tab, android.app.FragmentTransaction ft) { }
@Override
public void onTabSelected(Tab tab, android.app.FragmentTransaction ft) {
//the line mentioned in logcat
nsViewPager.setCurrentItem(tab.getPosition());
}
@Override
public void onTabUnselected(Tab tab, android.app.FragmentTransaction ft) { }
}
TabsPagerAdapter.java(因爲它正在改變標籤時崩潰,我認爲這可能是問題,但我看不出):
public class TabsPagerAdapter extends FragmentPagerAdapter {
public TabsPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int index) {
switch (index) {
case 0:
return new SettingsFragment();
case 1:
return new BusesFragment();
case 2:
return new ClassesFragment();
case 3:
return new ToDoListFragment();
case 4:
return new MapsFragment();
}
return null;
}
@Override
public int getCount() {
// item count, equal to number of tabs
return 5;
}
}
有關部分與該列表的標籤,ToDoListFragment.java(全代碼在這裏:https://github.com/BathUniApp/bath-uni-app/blob/master/src/ip7/bathuniapp/ToDoListFragment.java):
public class ToDoListFragment extends ListFragment implements OnClickListener {
private TasksDataSource datasource;
private ArrayList<ListItem> todolist = new ArrayList<ListItem>();
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.frag_todolist, null);
ListView listView = (ListView) getView().findViewById(android.R.id.list);
// Get the datasource for Tasks
datasource = new TasksDataSource(this.getActivity());
datasource.open();
// Return a list of tasks saved in the database
List<Task> tasks = datasource.getAllTasks();
// Use the SimpleCursorAdapter to show the elements in a ListView
ArrayAdapter<Task> adapter = new ArrayAdapter<Task>(this.getActivity(), android.R.layout.simple_list_item_1, tasks);
setListAdapter(adapter);
Button b = (Button) v.findViewById(R.id.addTask);
b.setOnClickListener(this);
return v;
}
}
frag_todolist.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">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<EditText
android:id="@+id/item1Date"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="2"
android:text="DD/MM"
android:textAppearance="?android:attr/textAppearanceSmall" />
<EditText
android:id="@+id/item1"
android:layout_width="0dp"
android:layout_weight="4"
android:layout_height="match_parent"
android:gravity="left"
android:text="Enter Title" />
</LinearLayout>
<EditText
android:id="@+id/item1Des"
android:layout_width="fill_parent"
android:layout_height="match_parent"
android:text="Enter Description" />
</LinearLayout>
<Button
android:id="@+id/addTask"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="ADD TASK"
android:onClick="onClick" />
<ListView
android:id="@android:id/list"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<TextView
android:id="@android:id/empty"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="No tasks added yet." />
</LinearLayout>
我覺得ListView控件必須是烏爾根元素sincuü從listfragment延長,最好的辦法就是不要從listfragment延長,因爲ü需要添加其他用戶界面從你的xml –