[Android] Fragment 사용법
■ 메인 액티비티에서 호출방법 : targetSdkVersion 26 일 때
Fragment fragment = new WebViewFragment();
//Fragment 호출시 파라미터 값을 전달 하고 싶을 경우 Bundle 클래스 사용
Bundle args = new Bundle();
args.putString(“URL”, “playground.naragara.com“);
fragment.setArguments(args);
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction()
.setCustomAnimations(R.anim.anim_slide_in_from_left,R.anim.anim_slide_out_from_left)
.replace(R.id.content_main, fragment)
.addToBackStack(null)
.commit();
————————————————————–
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
public class WebViewFragment extends Fragment {
private static final String ARG_PARAM1 = “URL”;
protected ProgressDialog progressDialog;
private WebView mainView;
private String TargetURL = “”;
private String currentURL;
public WebViewFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View rootView = inflater.inflate(R.layout.fragment_web_view, container, false);
mainView = (WebView) rootView.findViewById(R.id.mainWebView);
progressDialog = new ProgressDialog(getActivity());
currentURL = null;
if (getArguments() != null) TargetURL = getArguments().getString(ARG_PARAM1);
WebViewInit();
return rootView;
}
private void WebViewInit(){
//01. 스크롤 제거
//- 최초에 웹뷰를 가로 100%, 세로 100%로 생성하게 되면 스크롤이 보이게 됩니다.
// 스크롤로 인해 웹에서 100%로 작업이 되었음에도 app을 실행하면 우측에 스크롤 넓이 만큼의 공백이 생기게 됩니다. //이를 방지하려면 스크롤을 제거해줘야 합니다.
mainView.setHorizontalScrollBarEnabled(false); // 세로 scroll 제거
mainView.setVerticalScrollBarEnabled(false); // 가로 scroll 제거
//브라우저 세팅
WebSettings webSettings = mainView.getSettings();
webSettings.setJavaScriptEnabled(true); //자바스크립트 default 가 false 임
webSettings.setSupportMultipleWindows(true);// 새창띄우기 허용여부
webSettings.setJavaScriptCanOpenWindowsAutomatically(true);// 자바스크립트 새창뛰우기 (멀티뷰) 허용여부
webSettings.setLoadWithOverviewMode(true); //메타태크 허용여부
webSettings.setUseWideViewPort(true);//화면 사이즈 맞추기 허용여부
webSettings.setSupportZoom(true);//화면 줌 허용여부
webSettings.setBuiltInZoomControls(true); //화면 확대 축소 허용여부
webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN); //컨텐츠 사이즈 맞추기
webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE); //브라우저 캐시 허용여부
webSettings.setDomStorageEnabled(true); //로컬저장소 허용여부
//웹사이트와 데이터 주고 받기위해서 사용
//webview.addJavascriptInterface(new CheckupBridge(this, handler), “HybridApp”);
mainView.setWebChromeClient(new WebChromeClient() {
});
//Webview 안의 하이퍼링크 클리시 별도의 브라우저 띄우지 않고 기존 Webview에서 띄움
//Webview 안의 하이퍼링크 클릭시 shouldOverrideUrlLoading 콜백이 불 림
//shouldOverrideUrlLoading : 새창이 뜨지 않게 하기 위해서 많이 사용되는 함수.
// 이 부분에 내용을 넣어 주면 새로운 창이 열리지 않고 기존 창에서 로딩됨
mainView.setWebViewClient(new WebViewClient() {
public void onPageStarted(WebView view, String url, Bitmap favicon) {
progressDialog.show();
}
public void onPageFinished (WebView view, String url) {
progressDialog.dismiss();
}
});
//fragment back키 적용
mainView.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View view, int keyCode, KeyEvent keyEvent) {
if(keyEvent.getAction() != KeyEvent.ACTION_DOWN)
return true;
if(keyCode == KeyEvent.KEYCODE_BACK){
if(mainView.canGoBack()){
mainView.goBack();
} else { //if (!getFragmentManager().popBackStackImmediate()) {
getActivity().onBackPressed();
//super.onBackPressed();
}
return true;
}
return false;
}
});
mainView.loadUrl(TargetURL);
}
}
——————————————————————–
[fragment_web_view.xml]
<FrameLayout 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=“ddolcat.test.WebViewFragment”>
<WebView
android:layout_width=“match_parent”
android:layout_height=“match_parent”
android:id=“@+id/mainWebView” />
</FrameLayout>
■ 메인 액티비티에서 호출방법 : targetSdkVersion 28 일 때
API 레벨 28에서 부터는 FragmentManager 클래스를 사용할 수 없다.(This class was deprecated in API level 28.)
FragmentActivity.getSupportFragmentManager()를 사용합니다.
프레그먼트를 사용해야할 경우 아래와 같이 AppCompatActivity 혹은 Activity 사용할 수 없다.
public class MainActivity extends AppCompatActivity {}
public class MainActivity extends Activity {}
해결법은 FragmentActivity를 상속 받아서 처리하면 된다.
public class MainActivity extends FragmentActivity {
……………………………….생략
■ 프레그먼트에서 getSystemService(), getApplicationContext()오브젝트 호출 방법
Vibrator vibrator = (Vibrator) getActivity().getSystemService(Context.VIBRATOR_SERVICE);
btn1.setAnimation(AnimationUtils.loadAnimation(getActivity().getApplicationContext(), R.anim.bounce_xml));