我在SO上查看了与我的问题有关的问题,但无法弄清问题是什么。如果这是转贴,请耐心等待。
以下是我要找的内容:
手机的布局更改工作正常,因为它涉及片段内的相同视图。问题是当我尝试在平板电脑中获得以下布局时。
纵向模式下的
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);
}
MainPctivity中的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,我没有处于纵向模式。我该如何解决?如果您还需要代码,请告诉我。很高兴发帖..
答案 0 :(得分:7)
我能想到你得到这个错误的唯一方法是使用旧的布局。那可能是因为super.onCreate(savedInstanceState);
而是尝试忽略已保存的状态:
super.onCreate(null);
修改强>
对@matiash评论的回复:
由于OP没有提供重新创建问题的代码,因此很难测试其他(如果有的话)解决方案。
但我同意重置savedInstanceState
有点过分。因此,我认为OP应该亲自尝试并确保尽可能多地保存视图。
首先想到的是防止有问题的视图被保存:
<FrameLayout
android:id="@+id/detail_fragment_container"
android:layout_width="0dip"
android:layout_height="match_parent"
android:layout_weight="0.60"
android:saveEnabled="false"/>
答案 1 :(得分:0)
FragmentManager会在旋转时尝试重新创建所有片段,但在纵向模式下,您不再具有DetailFragment
布局,因此您应该删除片段以防止它被连接。
编辑:检测方向变化的最简洁方法可能是使用OrientationEventListener。您可以参考this post和this作为示例。您应该删除应该覆盖的方法onOrientationChanged (int orientation)
中的片段。
答案 2 :(得分:-1)
更改代码,
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;
}
希望它会帮助你