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( );

}

}

}

}

오늘부터 제가 했던 것들을 잊어버리지 않기 위해서

안드로이드에 관련 된 내용들을 하나하나 글로 남겨놓으려 합니다.

 

몇년 전에 책을 구입하여 간단한 안드로이드 어플리케이션을 제작해 본 적이 있습니다.

그 때는 당장 필요에 의해서 어플을 만든 것이었고 또한 급하게 필요한 내용만을

책에서 보고 만든 것이었기 때문에 그로 부터 얼마 지나지 않아서

안드로이드에 관련된 내용은 모두 제 머릿속에서 사라지게 되었습니다. (...)

 

그런 과오를 다시 되풀이 하지 않기 위해서

(사실 모든 공부라는 것이 복습을 하지 않으면 빠르게 잊어버리긴 합니다 -_- )

오늘부터 내 기억력의 한계를 인정하고 차후에 다시 사용할 만한 중요한 내용들을

요약하여 정리하려 합니다.

 

사실 환경설정하고 프로젝트 만드는 내용은 인터넷에 뒤지면 많이 나오니까

실제로 프로그램을 작성하는 데 필요한 내용들만 작성하도록 하겠습니다!

 

 

그럼 지금부터 버튼을 만들어서 클릭하면 토스트 메세지와 함께 인터넷 창을 띄우거나 전화걸기 창을 띄우는

간단한 기능을 구현해보도록 하겠습니다.

 

 

일단 첫 번째로 버튼을 만듭시다...

 

 

그럼 먼저 프로젝트를 하나 만드시고.. 자동으로 생성되는 파일 중에서

activity_mainDesign에서 왼쪽 옆의 Widgets 중에서 Button을 가져와서 화면에 2개 만들어줍니다.

 

위젯 메뉴에서 버튼이나 아이템들을 가져오면 자동으로 그 아이템에 대한 xml코드가 작성이 됩니다.

 

 

간단히 말해서 원래는 저렇게 코드를 직접 적어줘야 버튼이 생성되는 건데

안드로이드 스튜디오가 우리가 끌고온 아이템의 위치값이나 내용들을 바탕으로

알아서 코드를 작성해준다고 생각하면 됨...

 

옛날에 html 전혀 모르는 상태로도 나모웹에디터 등 프로그램으로

아이템을 끌어와 간단하게 홈페이지 만들 때가 생각이 나는군요.

 

 

(실제 코드)

 

여기서 android:Layout_ 으로 시작하는 아이템의 위치 정보도 중요하지만

해당 아이템의 이벤트나 기능을 추가하기 위해서는 android:id android:onClick이 중요합니다.

 

각 개체의 ID가 실제 어플리케이션을 보여주는 xml파일과 내부 기능을 구현하는 자바 코드 사이에

매개체 역할을 해 주는데요

 

만약 위젯에서 버튼을 가져와 만들 수는 있지만 이 버튼이 어떻게 동작할 지에 대한 자바 코드를 작성하지 않으면

이 버튼은 아무 기능도 하지 못하는 빈 껍데기 버튼이 되기 때문입니다.

 

 

그럼 이제 각 버튼이 눌러졌을 때 동작하는 기능을 구현하도록 합시다.

 

onClick은 해당 버튼이 클릭됐을 때 발생되는 이벤트를 말합니다.

예를 들어 해당 버튼이 눌려지면 onClick_INTERNET이라는 이벤트가 발생한다는 의미입니다.

 

이 이벤트가 발생하게 되면 어떤 일이 발생하는 지는 MainActivity.java 파일에서 자바 코드를 작성해야 합니다.

 

안드로이드에서 Activity란, 윈도우의 하나의 창과 비슷한 개념으로 생각하시면 되겠습니다

만약에 한 어플내에서 여러 창의 띄워져야 한다면 각 창에 대한 Activity의 xml파일자바 파일이 필요하게 됩니다.

저희는 아직 하나의 창만 사용하기 때문에 여기서 파일을 더 추가할 필요는 없습니다.

 

그럼 각 버튼에 onClick_INTERNET onClick_CALL 두 가지 onClick 이벤트를 설정해 주세요.

 

설정 했으면 이제 버튼 클릭 이벤트가 발생하면 일어날 일들을(?) 정해주러 갑시다.

 

MainActivity.java의 모습입니다.

저도 아직은 안드로이드에 대해서 잘 모르기 때문에 아는 내용만 적도록 하겠습니다 -_-;;

 

protected void onCreate(Bundle savedInstanceState)

메서드는 액티비티가 처음에 생성되었을 때 실행되는 메서드입니다.

액티비티가 만들어지려면 반드시 필요합니다. 아마 액티비티의 초기 설정등이 구현되어 있겠죠.

 

그리고 아랫쪽의 public void onClick_INTERNETpublic void onClick_CALL은 바로

저희가 아까 버튼에 입력했던 이벤트 이름과 일치해야 하며

해당 버튼이 클릭되었을 때 발생되는 이벤트를 정의하는 것입니다.

 

그리고 intent에 관련된 명령을 실행하면 반드시 startActivity(intent); 를 실행해 줘야 해당 기능이 적용이 됩니다.

 

또한 이 기능들을 사용하기 위해서는 반드시 추가적으로

import android.view.View;
import android.content.Intent;
import android.net.Uri;

이 세놈을 import 해야 합니다... 안그러면 에러뜹니다..

 

위의 코드를 입력한 다음 Shift+F10 이나 화면 윗쪽의 세모 모양으로 생긴 run 버튼을 클릭하면 어플이 실행됩니다.

 

 

 

 

내가 만든 어플 하나 완성...

나도 이제 어플리케이션 제작자이다.

 

여기서 INTERNET 버튼을 클릭해 보면,

 

 

이렇게 인터넷 창과 함께 아랫쪽에 "인터넷 접속" 이라는 조그만 토스트 메세지가 뜨는 것을 볼 수 있습니다.

폰의 뒤로가기 버튼을 누르면 다시 초기 화면으로 되돌아 감.

 

CALL 버튼을 눌렀을 때 모습.

 

 

잘 되는군요.

 

뭐 별로 한건 없는데 그럴듯한 어플리케이션이 만들어 졌습니다.

중요한 점은 계속 비슷한 어플을 만들어 응용하고 반복해봐야 한다는 것입니다.

 

한 번 해보고 쉽다고 그냥 넘어가버리면 지금 이 글을 쓰고있는 저처럼

나중에 기억이 안나서 처음부터 다시 공부해야 하는 불상사가 생길 수도 있습니다 (...)

 

그럼 버튼 만들기는 여기서 마치겠습니다.

 

대충 쓰려고 했는데 어쩌다 보니 너무 열심히 쓴거 같네요...

앞으로도 계속 써야하는데 어쩌지...

+ Recent posts