예전 부터 해보고 싶던 웹 서버 쪽 개념입니다.
말로 들은 것을 정리한 것이라 잘못 된 내용이 있다면 코멘트 부탁드립니다.
Activity가 아닌 곳 ,
Service , BroadcastReceiver , baseAdapter 등에서 Intent로 새로운 Activity를 열려고 하면
E/AndroidRuntime(27318): android.util.AndroidRuntimeException:
Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag.
Is this really what you want?
라는 런타임 에러가 나옵니다.
안드로이드에서 간단한 toast를 띄울 때 '어디다 띄울거냐' 를 판별하는 this 또는 클래스명.this 와 같이
어느 Task에 Activity를 띄울건지 모르겠다는 에러입니다.
Task는 Activity를 관리하는 것으로 Activity를 띄우려면 해당 Task에 띄워야 하는데
Service , BroadcastReceiver , baseAdapter 등 은 Activity가 아니므로 새로운 Activity를 띄우려면
에러에서의 설명과 같이
Intent intent = new Intent(mContext, BlackBoxVideoPlayActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
mContext.startActivity(intent);
Intent에 속성을 넣어 새로운 Task를 만들겠다고 해야합니다.
'Android > Android TIP' 카테고리의 다른 글
Android TIP] UnsupportedOperationException 습관 (0) | 2014.07.15 |
---|---|
Android TIP] strings.xml 에서 특수문자 사용하기 (1) | 2014.02.20 |
안드로이드 TIP] 안드로이드 데이터베이스 파일 PC로 가져오기 (0) | 2014.02.09 |
안드로이드 TIP] 터미널에서 Logcat 보기 (0) | 2014.02.04 |
안드로이드 TIP] APK 생성 시에 Lint Warnings 발생하는 문제 해결 방법 (0) | 2013.12.23 |
한 화면을 여러 공간으로 쪼개어 사용하거나 액티비티 이동없이 화면 내부구성을 다른 레이아웃으로
교체 시킬 때 등 Fragment는 여러 군데에서 사용되어지고 있습니다.
Fragment 란 ? : http://androidhuman.tistory.com/469
Fragment를 사용하려면 그것을 사용하는 상위 activity가 FragmentActivity 여야 합니다.
Fragment 생명주기는 activity와 흡사하며 주의 할 점이 activity에서 this로 쓰던 부분을 getActivity()로
바꿔 써주셔야 합니다.
큰 구성은 FragmentActivity를 상속받은 MainActivity.java 가 있고 Fragment 를 상속받은
OneFragment, TwoFragment, ThreeFragment.java 세가지 클래스를 만든다음
activity_main.xml에 있는 ll_fragment 영역에 위에만든 세가지 fragment 를 삽입하는 방식입니다.
먼저 MainActivity 구성입니다.
위 그림과 같이 activity_main.xml 레이아웃 하나에 fragment 가 교체 될 영역과 그 영역을 컨트롤 할
메뉴 뷰 를 만들어 줍니다.
<MainActivity>
public class MainActivity extends FragmentActivity implements OnClickListener {
final String TAG = "MainActivity";
int mCurrentFragmentIndex;
public final static int FRAGMENT_ONE = 0;
public final static int FRAGMENT_TWO = 1;
public final static int FRAGMENT_THREE = 2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button bt_oneFragment = (Button) findViewById(R.id.bt_oneFragment);
bt_oneFragment.setOnClickListener(this);
Button bt_twoFragment = (Button) findViewById(R.id.bt_twoFragment);
bt_twoFragment.setOnClickListener(this);
Button bt_threeFragment = (Button) findViewById(R.id.bt_threeFragment);
bt_threeFragment.setOnClickListener(this);
mCurrentFragmentIndex = FRAGMENT_ONE;
fragmentReplace(mCurrentFragmentIndex);
}
public void fragmentReplace(int reqNewFragmentIndex) {
Fragment newFragment = null;
Log.d(TAG, "fragmentReplace " + reqNewFragmentIndex);
newFragment = getFragment(reqNewFragmentIndex);
// replace fragment
final FragmentTransaction transaction = getSupportFragmentManager()
.beginTransaction();
transaction.replace(R.id.ll_fragment, newFragment);
// Commit the transaction
transaction.commit();
}
private Fragment getFragment(int idx) {
Fragment newFragment = null;
switch (idx) {
case FRAGMENT_ONE:
newFragment = new OneFragment();
break;
case FRAGMENT_TWO:
newFragment = new TwoFragment();
break;
case FRAGMENT_THREE:
newFragment = new ThreeFragment();
break;
default:
Log.d(TAG, "Unhandle case");
break;
}
return newFragment;
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.bt_oneFragment:
mCurrentFragmentIndex = FRAGMENT_ONE;
fragmentReplace(mCurrentFragmentIndex);
break;
case R.id.bt_twoFragment:
mCurrentFragmentIndex = FRAGMENT_TWO;
fragmentReplace(mCurrentFragmentIndex);
break;
case R.id.bt_threeFragment:
mCurrentFragmentIndex = FRAGMENT_THREE;
fragmentReplace(mCurrentFragmentIndex);
break;
}
}
}
전체적으로 보면 fragment 마다 int으로된 구분자를 주고 메뉴 버튼이 클릭 될 때마다 해당 fragment의
index를 mCurrentFragmentIndex 라는 int 형 변수에 담아 fragment 교체 매소드를 태우는 식입니다.
onCreate부터 보면 메뉴 버튼등록과 리스너를 달고 mCurrentFragmentIndex에 첫 화면 fragment인
FRAGMENT_ONE 를 넣어주고 fragmentReplace 매소드를 타게됩니다.
fragmentReplace 매소드에는 넘겨받은 fragment index를 가지고 getFragment 매소드를 가서
실질적인 fragment의 객체 생성을 하고 그 객체를 리턴해줍니다.
다시 fragmentReplace매소드로 돌아와 리턴받은 fragment로 ll_fragment 라는 레이아웃 영역에
교체를 하게 됩니다. 다른 버튼을 눌렀을 때도 이와 같은 방식으로 동작하게 됩니다.
Fragment 들은
public class OneFragment extends Fragment implements OnClickListener {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.onefragment, container, false);
Button button = (Button) v.findViewById(R.id.bt_ok);
button.setOnClickListener(this);
return v;
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.bt_ok:
Toast.makeText(getActivity(), "OneFragment", Toast.LENGTH_SHORT)
.show();
break;
}
}
}
이처럼 Activity와 비슷한 구조이고
마지막으로 activity_main.xml 구조입니다.
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#ffffffff"
android:orientation="vertical" >
<LinearLayout
android:id="@+id/ll_fragment"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1" />
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="10dp"
android:layout_marginTop="10dp"
android:background="#ffffffff"
android:orientation="horizontal" >
<Button
android:id="@+id/bt_oneFragment"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="1" />
<Button
android:id="@+id/bt_twoFragment"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="2" />
<Button
android:id="@+id/bt_threeFragment"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="3" />
</LinearLayout>
</LinearLayout>
</RelativeLayout>
ll_fragment 라는 영역이 Fragment들이 교체 될 영역입니다.
'Android' 카테고리의 다른 글
Android] 안드로이드에서 FTP 서버에 파일 업로드하기 (0) | 2014.02.16 |
---|---|
안드로이드] 페이스북 같은 슬라이드 메뉴 만들기 (49) | 2013.08.19 |
안드로이드] 쉬운 log 관리 (0) | 2013.07.26 |
안드로이드] Custom ArrayAdapter의 기본 틀 (0) | 2013.07.25 |
안드로이드] SharedPreferences 깔끔하게 사용하기 (9) | 2013.07.09 |