Fragment란, 어플리케이션에서 화면에 직접 보이는 공간인 Activity내에서


분할시키고 다른 화면으로 전환할 수 있는 화면 공간의 단위입니다.


Fragment를 이용하려면, 그 상위에 있는 Activity에서 출력할 layout을 제어해줘야 합니다.


하지만 Fragment내부에서 다른 Fragment로 이동하는 것은 그 Fragment가 자신의 하위레벨이 아니기 때문에


내부에서 직접 제어할 수 없으므로, 상위 레벨인 Activity를 호출하여 제어하는 형태가 되어야 합니다.



MainActivity 아래에 A, B, C 라는 3개의 Fragment를 만들었다고 가정 시,


A, B, C Fragment의 내부에서 서로 다른 Fragment로 전환하는 방법입니다.


먼저 MainActivity의 onCreate() 메소드에서 기본적으로 사용할 Fragment공간과 초기 Fragment의 Instance를 전달합니다.


- MainActivity.java

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

// 화면 전환 프래그먼트 선언 및 초기 화면 설정
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
fragmentTransaction.add(R.id.ContentLayout, StudyFragment.newInstance()).commit();
}


그 다음, 다른 Fragment로 전환할 때 이용할 메소드를 정의합니다.


- MainActivity.java

public void replaceFragment(Fragment fragment) {
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.ContentLayout, fragment).commit();      // Fragment로 사용할 MainActivity내의 layout공간을 선택합니다.
}

MainActivity에서든 Fragment 내부에서든 Fragment를 전환할 때 이 메소드를 이용할 예정입니다.



그리고 Fragment 내부에서 다른 Fragment로 전환할 event를 정의합니다.



- StudyFragment.java (study_fragment.xml Layout 이용)

public class StudyFragment extends Fragment {

// 각각의 Fragment마다 Instance를 반환해 줄 메소드를 생성합니다.
public static StudyFragment newInstance() {
return new StudyFragment();
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstaceState) {
View view = inflater.inflate(R.layout.study_fragment, null); // Fragment로 불러올 xml파일을 view로 가져옵니다.
Button button1 = (Button)view.findViewById(R.id.study_button); // click시 Fragment를 전환할 event를 발생시킬 버튼을 정의합니다.

button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {

// getActivity()로 MainActivity의 replaceFragment를 불러옵니다.
((MainActivity)getActivity()).replaceFragment(NewFragment.newInstance());    // 새로 불러올 Fragment의 Instance를 Main으로 전달
}
});

return view;
}
}

참고로 Activity 하위의 모든 Fragment들이 newInstance() 메소드를 가지고 있어야 화면 전환이 가능합니다.


이걸로 생각보다 간단하게 해결했습니다.

제가 작성하고 있는 앱의 경우 service를 이용하고 있기 때문에


종료되지 않고 폰이 켜져있는 한 계속 실행되고 있습니다.


여기서 Thread를 동작시키고, 앱을 이용하고 있을 때만 Thread를 동작시키고 앱이나 화면이 꺼지면 Thread를 중지시키려 합니다.


하지만 Thread.stop() 기능이 deprecated되었기 때문에 (더 이상의 API에서 지원을 하지 않는 기능이기 때문에)


다른 방법을 찾아보았습니다.



- while( )의 조건을 이용

=> 쓰레드가 동작하는 조건을 결정하는 boolean변수를 하나 만들어 쓰레드의 동작을 제어합니다.


private boolean condition = true;


@Override

public void onDestroy( ) {

super.onDestroy( );

condition = false;

}


MyThread th = new MyThread( );

th.start( );


class MyThread extends Thread( ) {

public void run( ) {

while(condition) {

 . . .

}

}

}


- Thread.interrupt( )를 이용

=> 앞의 방식과 기능은 유사하나 쓰레드의 인터럽트 함수를 사용하는 경우입니다.


MyThread th = new MyThread( );

th.start( );


@Override

public void onDestroy( ) {

super.onDestroy( );

th.interrupt( );

}


class MyThread extends Thread( ) {

public void run( ) {

while(!isInterrupted()) {

 . . .

try {

. . .

} catch (InterruptedException e) {

Thread.currentThread( ).interrupt( );

} catch (Exception e) {

e.printStackTrace( );

}

}

}

}

+ Recent posts