平板电脑屏幕方向更改 – 没有查找ID为片段

我已经看过有关我的问题的问题,但不知道是什么问题。 如果这是转发,请和我联系。

这是我正在寻找的:

手机肖像模式

电话风景模式

手机的布局更改工作正常,因为它涉及片段内的相同视图。 问题是,当我尝试在平板电脑中获得以下布局。

Tablet肖像模式

平板电脑景观模式

我的布局结构

纵向模式下的activity_main.xml:

<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/drawer_layout" android:layout_width="match_parent" android:layout_height="match_parent" > <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <include android:id="@+id/toolbar" layout="@layout/toolbar_with_spinner" /> <FrameLayout android:id="@+id/fragment_container" android:layout_width="match_parent" android:layout_height="match_parent" > </FrameLayout> </LinearLayout> <ListView android:id="@+id/listview_drawer" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_gravity="start" android:background="@color/white" android:choiceMode="singleChoice" android:divider="@null" android:dividerHeight="0dp" /> </android.support.v4.widget.DrawerLayout> 

横向模式下的activity_main.xml:

 <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/drawer_layout" android:layout_width="match_parent" android:layout_height="match_parent" > <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <include android:id="@+id/toolbar" layout="@layout/toolbar_with_spinner" /> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:baselineAligned="false" android:orientation="horizontal" > <FrameLayout android:id="@+id/fragment_container" android:layout_width="0dip" android:layout_height="match_parent" android:layout_weight="0.40" /> <FrameLayout android:id="@+id/detail_fragment_container" android:layout_width="0dip" android:layout_height="match_parent" android:layout_weight="0.60" /> </LinearLayout> </LinearLayout> <ListView android:id="@+id/listview_drawer" android:layout_width="240dp" android:layout_height="match_parent" android:layout_gravity="start" android:background="@color/white" android:choiceMode="singleChoice" android:divider="@null" android:dividerHeight="0dp" /> </android.support.v4.widget.DrawerLayout> 

fragment_main.xml

 <?xml version="1.0" encoding="utf-8"?> <android.support.v4.widget.SwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/swipeRefreshLayout" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/white" android:orientation="vertical" android:padding="4dp" > <GridView android:id="@+id/gridview" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/white" android:horizontalSpacing="0dp" android:numColumns="3" android:stretchMode="columnWidth" android:verticalSpacing="0dp" > </GridView> <WebView android:id="@+id/webview_fragment_main" android:layout_width="match_parent" android:layout_height="match_parent" android:visibility="gone" /> </android.support.v4.widget.SwipeRefreshLayout> 

MainActivity – onCreate():

 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); if (Const.DEBUGGING_INT) Log.d(Const.DEBUG, "Activity - onCreate"); prefs = PreferenceManager.getDefaultSharedPreferences(this); if (Const.DEBUGGING) Log.d(Const.DEBUG, "Index = " + index); mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); toolbar = (Toolbar) findViewById(R.id.toolbar); spinner = (Spinner) toolbar.findViewById(R.id.spinner); mDrawerList = (ListView) findViewById(R.id.listview_drawer); setUpHeaderAndFooter(); setSupportActionBar(toolbar); getSupportActionBar().setHomeButtonEnabled(true); getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setTitle(""); setUpToolBar(); setUpSpinner(); setUpNavigationDrawer(); if ((findViewById(R.id.fragment_container) != null) && (findViewById(R.id.detail_fragment_container) != null)) { mTwoPane = true; } else { mTwoPane = false; } setFragment(prefs.getInt(Const.Prefs.MAININDEX, 0), 0); } 

MainActivity中的setFragment方法:

 private void setFragment(int mainIndex, int subIndex) { if (Const.DEBUGGING_INT) { Log.d(Const.DEBUG, "Activity - setFragment"); Log.d(Const.DEBUG, "Position = " + mainIndex); Log.d(Const.DEBUG, "TwoPane? " + mTwoPane); } incrementClickCount(mainIndex); mMainFragment = new MainFragment(); getSupportFragmentManager().beginTransaction() .replace(R.id.fragment_container, mMainFragment).commit(); Bundle bundle = new Bundle(); bundle.putInt(Const.BundleParameters.MAININDEX, mainIndex); bundle.putInt(Const.BundleParameters.SUBINDEX, subIndex); bundle.putBoolean(Const.BundleParameters.TWOPANE, mTwoPane); bundle.putInt(Const.BundleParameters.CURRENTPOSITION, 0); mMainFragment.setParameters(bundle); mDrawerList.setItemChecked(mainIndex, true); mDrawerLayout.closeDrawer(mDrawerList); if (mTwoPane) { mDetailFragment = new DetailFragment(); getSupportFragmentManager().beginTransaction() .replace(R.id.detail_fragment_container, mDetailFragment) .commit(); if (Const.DEBUGGING) Log.d(Const.DEBUG, "URL = " + prefs.getString(Const.Prefs.CURRENT_URL, "")); Bundle b = new Bundle(); b.putString("url", prefs.getString(Const.Prefs.CURRENT_URL, "")); mDetailFragment.setParameters(b); } } 

MainFragment – onCreateView():

 @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { Log.d(Const.DEBUG, "Fragment - onCreateView"); View view = inflater.inflate(R.layout.fragment_main, container, false); mSwipeRefreshLayout = (SwipeRefreshLayout) view .findViewById(R.id.swipeRefreshLayout); mSwipeRefreshLayout.setOnRefreshListener(this); mSwipeRefreshLayout.setColorSchemeResources(R.color.blue, R.color.green, R.color.pink, R.color.yellow); // if (!mSwipeRefreshLayout.isRefreshing()) mSwipeRefreshLayout.setRefreshing(true); prefs = PreferenceManager.getDefaultSharedPreferences(activity); mDbAdapter = DatabaseHelper.get(getActivity().getApplicationContext()) .getDbAdapter(); gridview = (GridView) view.findViewById(R.id.gridview); webview = (WebView) view.findViewById(R.id.webview_fragment_main); webview.setWebViewClient(new MyWebViewClient()); webview.setWebChromeClient(new WebChromeClient() { @Override public boolean onJsAlert(WebView view, String url, String message, JsResult result) { return super.onJsAlert(view, url, message, result); } }); WebSettings settings = webview.getSettings(); settings.setJavaScriptEnabled(true); settings.setCacheMode(WebSettings.LOAD_NO_CACHE); webview.setVerticalScrollBarEnabled(false); webview.setHorizontalScrollBarEnabled(false); setTableDetails(); isTableEmpty = mDbAdapter.isTableEmpty(mTableName); if (isTableEmpty) { getDataFromServer(true); } else { checkRefreshTimeAndGetData(); } return view; } 

DetailFragment – onCreateView():

 @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { if (Const.DEBUGGING) { Log.d(Const.DEBUG, "***** DetailFragment - onCreateView *****"); Log.d(Const.DEBUG, "URL = " + url); } View view = inflater .inflate(R.layout.fragment_detail, container, false); prefs = PreferenceManager.getDefaultSharedPreferences(activity); pd = (ProgressBar) view.findViewById(R.id.progressBar); webview = (WebView) view.findViewById(R.id.webview_fragment_detail); webview.setWebViewClient(new MyWebViewClient()); webview.setWebChromeClient(new WebChromeClient() { @Override public boolean onJsAlert(WebView view, String url, String message, JsResult result) { return super.onJsAlert(view, url, message, result); } }); pd.setVisibility(View.VISIBLE); webview.setVisibility(View.GONE); WebSettings settings = webview.getSettings(); settings.setJavaScriptEnabled(true); webview.setVerticalScrollBarEnabled(false); webview.setHorizontalScrollBarEnabled(false); webview.loadUrl(url); // webview.loadDataWithBaseURL(url, null, "text/html", "utf-8", null); return view; } 

logcat的:

 11-16 23:15:05.234: E/FragmentManager(26609): No view found for id 0x7f0a0052 (com.xx.xxx:id/detail_fragment_container) for fragment DetailFragment{42476ab8 #1 id=0x7f0a0052} 

我明白,它正在寻找detail_fragment_container,我没有肖像模式。 我该如何解决? 让我知道你是否也需要这个代码。 将很高兴发布..

Solutions Collecting From Web of "平板电脑屏幕方向更改 – 没有查找ID为片段"

我能想到你得到这个错误的唯一方法就是使用你的旧布局。 这可能是因为super.onCreate(savedInstanceState);

而是尝试忽略保存的状态:

 super.onCreate(null); 

编辑:

回复@matiash评论:

由于OP没有提供代码来重新创build问题,所以很难testing其他(如果有的话)解决scheme。

不过,我同意重置savedInstanceState是一种矫枉过正。 所以我觉得OP应该自己尝试一下,看看他尽可能保存多less个视图。

首先想到的是防止有问题的观点被保存:

 <FrameLayout android:id="@+id/detail_fragment_container" android:layout_width="0dip" android:layout_height="match_parent" android:layout_weight="0.60" android:saveEnabled="false"/> 

FragmentManager将在旋转时尝试重新创build所有的片段,但在纵向模式下,您不再具有DetailFragment布局,因此应该删除片段以防止它被连接。

编辑:也许最干净的方式来检测您的方向更改是使用OrientationEventListener 。 你可以参考这个post , 这个例子。 你应该删除onOrientationChanged (int orientation)方法中的片段,你应该覆盖这个片段。

更改代码,

 if ((findViewById(R.id.fragment_container) != null) && (findViewById(R.id.detail_fragment_container) != null)) { mTwoPane = true; } else { mTwoPane = false; } 

通过

 if(getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE){ //Do some stuff mTwoPane = true; } else{ mTwoPane = false; } 

希望它会帮助你