마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

Fragment내 WebView 화면 회전시 재생성되는 문제 질문입니다.

0 추천

안녕하세요.

이런 식으로 웹뷰를 2개 배치하는 앱을 만들려고 하는 초보자입니다...

 

프래그먼트를 사용하면 화면이 회전되어 레이아웃이 바뀌어도

객체를 재생성하지 않는다고 해서 사용해봤는데

레이아웃은 위와 같이 정상적으로 바뀌지만

덩달아 웹뷰가 재생성되어 웹 페이지를 다시 불러옵니다.

Fragment의 setRetainInstance 메소드를 사용하면 된다고 들었는데

제가 잘못 사용해서 그런지... 잘 모르겠습니다......

메니페스트 configChanges에 orientation, screensize, keyboardHidden 을 적용해보아도 안되고...

 

가능하면 화면 회전시 기존에 보여주던 웹 페이지를 다시 로딩하지 않고 보여주고 싶은데

아무리 고민해봐도 잘 되지 않아서 한번 질문드립니다.

어떤 방법을 사용해야 레이아웃이 바뀌어도 웹뷰를 유지할 수 있을지

혹시 제가 코딩한 부분에 잘못된 부분이 있는지 알고 싶습니다...

도움 부탁드립니다. (_ _)

 

# layout-land/activity_main.xml & layout-port/activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal" <!-- layout-port/activitity_main.xml은 vertical -->
    tools:context=".MainActivity" >
    <fragment
        android:name="com.example.simplefrag.Fragment1"
        android:id="@+id/fragment1"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1" />
    <fragment
        android:name="com.example.simplefrag.Fragment2"
        android:id="@+id/fragment2"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1" />
</LinearLayout>

 

# MainActivity.java

public class MainActivity extends Activity {
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
	}
}

 

# layout/fragment1.xml & layout/fragment2.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".Fragment1" >
    <WebView
        android:id="@+id/webView1" <!-- layout/fragment2.xml은 webView2 -->
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" />
</LinearLayout>

 

# Fragment1.java & Fragment2.java

public class Fragment1 extends Fragment {

	View v;
	WebView webView1; // Fragment2.java 에서는 webView2
	
	@Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setRetainInstance(true);
    }
	
	@Override
    public View onCreateView(LayoutInflater inflater, 
    		ViewGroup container, Bundle savedInstanceState) {
		v = inflater.inflate(R.layout.fragment1, container, false);
        return v;
	}
	
	 @Override
	 public void onActivityCreated(Bundle savedInstanceState) {
		super.onActivityCreated(savedInstanceState);
		 
		webView1 = (WebView)v.findViewById(R.id.webView1); // Fragment2.java 에서는 webView2
	        
	        /* 웹뷰 관련 셋팅 코드 생략... */
		 
		webView1.loadUrl("http://m.daum.net"); // Fragment2.java 에서는 webView2
	 } }

 

 

 

 

 

 

 

 

히로이즘 (150 포인트) 님이 2013년 11월 2일 질문

1개의 답변

0 추천
 
채택된 답변
제가 보기엔 화면 회전시 레이아웃 파일을 바꾸시는거 같은데 그러면 해당 레이아웃의 오브젝트들은 새로 만들어 질텐데... 프레그먼트도 새로 만들어지기 때문에 다시 로딩되는걸로 보입니다만....

그리고 setRetainInstance 이 메소드도 읽어보니 액티비티 재생성에 무관하게 만들어주는 걸로 보이는데 해당 프레그먼트가 액티비티 재생성 될때 destroy 되지 않을 뿐이지 해당 프레그먼트가 레이아웃에 다시 사용된다는건 아닌걸로 보입니다.

제 생각엔 레이아웃 파일에 프레그먼트를 바로 사용하지 마시고 프레그먼트대신 뷰그룹을 넣으시고, 프레그먼트는 따로 만들어서 뷰그룹에 넣어주는 식으로 사용하면 될거 같은데요.
whitesnow (8,920 포인트) 님이 2013년 11월 4일 답변
히로이즘님이 2013년 11월 7일 채택됨
헉... 뷰그룹을 만들어서 그 안에 프레그먼트를 넣었더니 화면이 회전되어도 웹뷰에 보여진 웹 페이지가 그대로 유지가 되네요!

정말정말 감사합니다!!! (_ _)
...