I have looked at questions related to my problem on SO but couldn't figure out what the problem is. Bear with me if this is a repost.
Here is what i am looking for:
The layout changes for phone are working fine as it involves the same views inside the fragment. The problem is when i try get the below layout in tablets.
activity_main.xml in portrait mode:
<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 in landscape mode:
<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);
}
setFragment Method in MainActivity:
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}
I understand that it's looking for detail_fragment_container, that i don't have in portrait mode. How do i fix this? Let me know if you need the code as well. Will be glad to post..
The only way I can think of you getting that error is that your old layout is used. That could be because super.onCreate(savedInstanceState);
Instead try ignoring the saved state:
super.onCreate(null);
Edit:
Response to @matiash comment:
Since OP didn't provide code to re-create the problem, it's hard to test other (if any) solutions.
However I do agree that resetting the savedInstanceState
is kind of an overkill. Therefore I think OP should try it himself and see to it that he saves as many views as possible.
The first thing that comes to mind is preventing the problematic view from being saved:
<FrameLayout
android:id="@+id/detail_fragment_container"
android:layout_width="0dip"
android:layout_height="match_parent"
android:layout_weight="0.60"
android:saveEnabled="false"/>
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With