我有一個非常簡單的應用程序,可以在橫向模式和縱向模式之間切換。在縱向模式下,我有一個碎片顯示列表中的數據和橫向模式我有另一個片段,顯示我的數據在網格中。只是重新迭代,有兩個不同的片段,一個以縱向模式呈現數據的ListFragment和一個以橫向模式顯示數據的「GridFragment」。只要器件方向不變,各個片段就可以正確渲染。然而,應用程序崩潰了設備從縱向翻轉到橫向或反之亦然的時刻。使用片段在橫向和縱向模式之間切換
首先這裏有當設備從縱向模式撞飛到景觀我的錯誤logs.The錯誤日誌:
十一月9日至22日:48:38.990:E/AndroidRuntime(29737):致命異常: main 09-22 11:48:38.990:E/AndroidRuntime(29737):java.lang.RuntimeException:無法啓動活動ComponentInfo {com.funapp.ssnd/com.funapp.ssnd.MainActivity}:java.lang.RuntimeException :你的內容必須有一個ListView,它的id屬性是'android.R.id.list' 09-22 11:48:38.990:E/AndroidRuntime(29737):at android.app.ActivityThread.performLaunchActivity(ActivityThread.java: 2184) 09-22 11:48:38.990:E/AndroidRuntime(29737):at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2211) 09-22 11:48:38.990:E/AndroidRuntime(29737):at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3677) 09-22 11:48:38.990:E/AndroidRuntime(29737):at android.app.ActivityThread.access $ 700(ActivityThread.java:149) 09-22 11:48:38.990:E/AndroidRuntime(29737):at android.app .ActivityThread $ H.handleMessage(ActivityThread.java:1306) 11月9日至22日:48:38.990:E/AndroidRuntime(29737):在android.os.Handler.dispatchMessage(Handler.java:99) 11月9日至22日:48:38.990:E/AndroidRuntime(29737):在android.os.Looper.loop(Looper.java:153) 09-22 11:48:38.990:E/AndroidRuntime(29737):at android.app.ActivityThread .main(ActivityThread.java:4987) 09-22 11:48:38.990:E/AndroidRuntime(29737):在java.la ng.reflect.Method.invokeNative(本機方法) 11月9日至22日:48:38.990:E/AndroidRuntime(29737):在java.lang.reflect.Method.invoke(Method.java:511) 11月9日至22日:48:38.990:E/AndroidRuntime(29737):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:821) 11月9日至22日:48:38.990:E/AndroidRuntime(29737):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:584) 11月9日至22日:48:38.990:E/AndroidRuntime(29737):在dalvik.system.NativeStart.main(本機方法) 09 -22 11:48:38.990:E/AndroidRuntime(29737):引起:java.lang.RuntimeException:您的內容必須具有List屬性爲'android.R.id.list'的ListView 09-22 11:48 :38.990:E/AndroidRuntime(29737):在android.support.v4.app.ListFragment.ensureList(ListFragment.java:344) 09-22 11:48:38.990:E/An droidRuntime(29737):在android.support.v4.app.ListFragment.onViewCreated(ListFragment.java:145) 09-22 11:48:38.990:E/AndroidRuntime(29737):在android.support.v4.app。 FragmentManagerImpl.moveToState(FragmentManager.java:956) 09-22 11:48:38.990:E/AndroidRuntime(29737):在android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1121) 09-22 11:48:38.990:E/AndroidRuntime(29737):at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1103) 09-22 11:48:38.990:E/AndroidRuntime(29737):at android.support.v4.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManager.java:1901) 09-22 11:48:38.990:E/AndroidRuntime(29737):at android.support.v4.app.FragmentActivity.onStart(FragmentActivity。 java:567) 09-22 11:48:38.990:E/AndroidRuntime(29737):at android.a pp.Instrumentation.callActivityOnStart(Instrumentation.java:1166) 11月9日至22日:48:38.990:E/AndroidRuntime(29737):在android.app.Activity.performStart(Activity.java:5030) 11月9日至22日: 48:38。990:E/AndroidRuntime(29737):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2157) 11月9日至22日:48:38.990:E/AndroidRuntime(29737):... 12更
而錯誤日誌當裝置改變從橫向到縱向:
11月9日至22日:52:20.906:E/AndroidRuntime(29943):致命異常:主 11月9日至22日:52:20.906 :E/AndroidRuntime(29943):java.lang.RuntimeException:無法啓動活動ComponentInfo {com.funapp.ssnd/com.funapp.ssnd.MainActivity}:java.lang.NullPointerException 09-22 11:52:20.906: E/AndroidRuntime(29943):at和roid.app.ActivityThread.performLaunchActivity(ActivityThread.java:2184) 09-22 11:52:20.906:E/AndroidRuntime(29943):at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2211) 09-22 11:52:20.906:E/AndroidRuntime(29943):在android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3677) 09-22 11:52:20.906:E/AndroidRuntime(29943):在android.app。 ActivityThread.access $ 700(ActivityThread.java:149) 09-22 11:52:20.906:E/AndroidRuntime(29943):at android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1306) 09-22 11 :52:20.906:E/AndroidRuntime(29943):at android.os.Handler.dispatchMessage(Handler.java:99) 09-22 11:52:20.906:E/AndroidRuntime(29943):at android.os.Looper .loop(Looper.java:153) 09-22 11:52:20.906:E/AndroidRuntime(29943 ):at android.app.ActivityThread.main(ActivityThread.java:4987) 09-22 11:52:20.906:E/AndroidRuntime(29943):at java.lang.reflect.Method.invokeNative(Native Method) 09 -22 11:52:20.906:E/AndroidRuntime(29943):at java.lang.reflect.Method.invoke(Method.java:511) 09-22 11:52:20.906:E/AndroidRuntime(29943):at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:821) 09-22 11:52:20.906:E/AndroidRuntime(29943):at com.android.internal.os.ZygoteInit.main( ZygoteInit.java:584) 09-22 11:52:20.906:E/AndroidRuntime(29943):at dalvik.system.NativeStart.main(Native Method) 09-22 11:52:20.906:E/AndroidRuntime(29943 ):引起:java.lang.NullPointerException 09-22 11:52:20.906:E/AndroidRuntime(29943):at com.funapp.ssnd.DetailsFragment.onActivityCreate d(DetailsFragment.java:59) 09-22 11:52:20.906:E/AndroidRuntime(29943):at android.support.v4.app.Fragment.performActivityCreated(Fragment.java:1512) 09-22 11: 52:20.906:E/AndroidRuntime(29943):在android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:962) 09-22 11:52:20.906:E/AndroidRuntime(29943):在android。 support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1121) 09-22 11:52:20.906:E/AndroidRuntime(29943):at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java: 1103) 09-22 11:52:20.906:E/AndroidRuntime(29943):at android.support.v4.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManager.java:1901) 09-22 11:52:20.906:E/AndroidRuntime(29943):在android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:567) 09-22 11:52:20.906:E/AndroidRuntime(29943):at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1166) 09-22 11:52:20.906:E/AndroidRuntime(29943):at android.app.Activity.performStart(Activity.java:5030) 09-22 11:52:20.906:E/AndroidRuntime(29943):at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2157) 09-22 11:52:20.906:E/AndroidRuntime(29943):... 12更
的包含碎片的活動:
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.content.res.Configuration;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
public class MainActivity extends FragmentActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Configuration config = getResources().getConfiguration();
if(config.orientation == Configuration.ORIENTATION_PORTRAIT){
setContentView(R.layout.activity_main);
FragmentManager manager = getSupportFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
MemberListFragment fragment1 = new MemberListFragment();
transaction.add(R.id.fragment_container,fragment1);
transaction.commit();
}
if(config.orientation == Configuration.ORIENTATION_LANDSCAPE){
setContentView(R.layout.activity_main);
FragmentManager manager = getSupportFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
DetailsFragment fragment2 = new DetailsFragment();
transaction.add(R.id.fragment_container,fragment2);
transaction.commit();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, 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();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
另外,佈局文件。對於人像模式:
<?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" >
<ListView android:id="@id/android:list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:drawSelectorOnTop="false"/>
</LinearLayout>
和景觀模式:
<?xml version="1.0" encoding="utf-8"?>
<GridView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/grid_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:columnWidth="90dp"
android:numColumns="3"
android:verticalSpacing="10dp"
android:horizontalSpacing="10dp"
android:stretchMode="columnWidth"
android:gravity="center"
/>
而片段。對於人像模式:
import java.util.ArrayList;
import java.util.List;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.app.ListFragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ListView;
public class MemberListFragment extends ListFragment {
String[] membersList;
Integer[] imageList;
ListView listView;
List<RowItem> rowItems;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle bundle){
return inflater.inflate(R.layout.fragment_layout, container,false);
}
@Override
public void onActivityCreated(Bundle savedInstanceState){
super.onActivityCreated(savedInstanceState);
rowItems = new ArrayList<RowItem>();
membersList = (getResources().getStringArray(R.array.snsd_members));
imageList = new Integer[membersList.length];
for(int i=0; i<membersList.length; i++){
imageList[i] = R.drawable.home;
}
for(int i=0; i<membersList.length; i++){
RowItem item = new RowItem(imageList[i], membersList[i]);
rowItems.add(item);
}
listView = (ListView) getListView();
SNSDAdapter adapter = new SNSDAdapter(getActivity().getApplicationContext(),
R.layout.list_element, rowItems);
listView.setAdapter(adapter);
}
}
和橫向模式:
import java.util.ArrayList;
import java.util.List;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.GridView;
public class DetailsFragment extends Fragment {
String[] membersList;
Integer[] imageList;
GridView gridView;
List<RowItem> rowItems;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle bundle){
View view = inflater.inflate(R.layout.fragment_layout, container,false);
gridView = (GridView)view.findViewById(R.id.grid_view);
return view;
}
@Override
public void onActivityCreated(Bundle savedInstanceState){
super.onActivityCreated(savedInstanceState);
rowItems = new ArrayList<RowItem>();
membersList = (getResources().getStringArray(R.array.snsd_members));
imageList = new Integer[membersList.length];
for(int i=0; i<membersList.length; i++){
imageList[i] = R.drawable.home;
}
for(int i=0; i<membersList.length; i++){
RowItem item = new RowItem(imageList[i], membersList[i]);
rowItems.add(item);
}
Log.v("ROW ITEMS",rowItems.toString());
GridAdapter adapter = new GridAdapter(getActivity().getApplicationContext(),rowItems);
gridView.setAdapter(adapter);
}
}
我花了很多時間試圖解決這個沒有一個解決方案到位。難道這是因爲當屏幕旋轉時,我的碎片並沒有真正被「破壞」,從而阻止了新的碎片取代它?任何解決方案或某些方向將非常感激。
例外來自你的碎片的代碼。你能不能展示這些代碼(相關部分)? – Szymon 2014-09-22 06:40:13
@Symmon我也添加了片段代碼。 – user1841702 2014-09-22 06:44:46
你的清單中的活動聲明中是否有類似「android:configChanges =」orientation「」的行? – labreu 2014-09-22 06:58:19