2014-09-22 65 views
0

我有一个非常简单的应用程序,可以在横向模式和纵向模式之间切换。在纵向模式下,我有一个碎片显示列表中的数据和横向模式我有另一个片段,显示我的数据在网格中。只是重新迭代,有两个不同的片段,一个以纵向模式呈现数据的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); 

} 




} 

我花了很多时间试图解决这个没有一个解决方案到位。难道这是因为当屏幕旋转时,我的碎片并没有真正被“破坏”,从而阻止了新的碎片取代它?任何解决方案或某些方向将非常感激。

+0

例外来自你的碎片的代码。你能不能展示这些代码(相关部分)? – Szymon 2014-09-22 06:40:13

+0

@Symmon我也添加了片段代码。 – user1841702 2014-09-22 06:44:46

+0

你的清单中的活动声明中是否有类似“android:configChanges =”orientation“”的行? – labreu 2014-09-22 06:58:19

回答

0

检查ListView ID在XML文件... 应该android:id="@android:id/list"

+0

当应用在纵向模式下呈现时,它会按预期方式显示ListView。当设备方向从纵向改变为横向时,看起来好像我的活动仍然期望列表视图,但事实上应该呈现网格视图。这是否意味着每当设备方向发生变化时,我的“列表视图”片段都会重新创建?同样适用于从横向模式到纵向模式的更改。这可能有助于了解每个方向更改的错误日志。 – user1841702 2014-09-22 06:50:19

+0

可能处于横向模式活动无法找到ListView ..所以你只是禁用横向模式下的列表视图.. – shashi2459 2014-09-22 06:57:36

相关问题