Handling bundles in activities and fragments
24057 단어 Android 개발 경험Andriod 개발 총화
Bundle 은 매우 유용 한 데이터 용기 로 String 값 과 각종 Parceable 을 매 핑 할 수 있 는 데이터 형식 입 니 다.그래서 대체적으로 Bundle 은 복잡 한 키 사전 입 니 다.Bundles 는 Intents / activities / Fragments 에서 값 을 전달 하 는 데 사 용 됩 니 다.다음은 안 드 로 이 드 에서 Bundles 를 어떻게 사용 하 는 지 에 대해 논의 할 것 이다.
Activity
Intent 를 사용 하여 Activity 를 만 들 때 추가 데 이 터 를 전달 할 수 있 습 니 다.데 이 터 는 Bundle 에 저장 되 어 있 으 며, getIntent (). getExtras () 방법 을 호출 하여 얻 을 수 있 습 니 다.Activity 를 위해 new Intent () 정적 방법 을 실현 하 는 좋 은 습관 이 있 습 니 다. 이 방법 은 이 Activity 를 만 드 는 Intent 를 되 돌려 줍 니 다.이 방식 을 통 해 Activity 에 전 달 된 매개 변수 변 수 를 컴 파일 단계 에서 검사 할 수 있 습 니 다. 마찬가지 로 이 방식 도 Service 와 Broadcast 에 사 용 됩 니 다.
Bundle 은 Activity 가 다시 초기 화 될 때 도 마찬가지 로 현재 예제 의 상 태 를 유지 하 는 데 사 용 됩 니 다. 예 를 들 어 Activity 의 configuration 이 변 할 때 도 사 용 됩 니 다.onSave InstanceState (Bundle) 방법 에 데 이 터 를 넣 고 onCreate (Bundle) 나 onRestore InstanceState (Bundle) 방법 에서 이 데 이 터 를 얻 을 수 있 습 니 다.이 몇 가지 방법의 주요 차이 점 은 onRestore InstanceState (Bundle) 방법 이 onStart () 방법 이후 에 호출 된다 는 것 이다.
public class ExampleActivity extends Activity
{
public static final String EXTRA_PRODUCT_ID = "product_id";
public static final String EXTRA_PRODUCT_TITLE = "product_title";
private static final String SAVED_PAGER_POSITION = "pager_position";
public static Intent newIntent(Context context, String productId, String productTitle)
{
Intent intent = new Intent(context, ExampleActivity.class);
// extras
intent.putExtra(EXTRA_PRODUCT_ID, productId);
intent.putExtra(EXTRA_PRODUCT_TITLE, productTitle);
return intent;
}
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_example);
// restore saved state
if(savedInstanceState != null)
{
handleSavedInstanceState(savedInstanceState);
}
// handle intent extras
Bundle extras = getIntent().getExtras();
if(extras != null)
{
handleExtras(extras);
}
}
@Override
public void onSaveInstanceState(Bundle outState)
{
// save current instance state
super.onSaveInstanceState(outState);
// TODO
}
@Override
public void onRestoreInstanceState(Bundle savedInstanceState)
{
// restore saved state
super.onRestoreInstanceState(savedInstanceState);
if(savedInstanceState != null)
{
// TODO
}
}
private void handleSavedInstanceState(Bundle savedInstanceState)
{
// TODO
}
private void handleExtras(Bundle extras)
{
// TODO
}
}
Fragment
새 Fragment 인 스 턴 스 를 만 들 때 setArguments (Bundle) 방법 으로 인 자 를 전달 할 수 있 습 니 다.또한 getArguments () 방법 으로 인 자 를 얻 을 수 있 습 니 다.때때로 많은 매개 변수의 구조 함 수 를 초기 화 하 는 것 은 적절 하지 않 은 용법 일 수 있다.Fragment 인 스 턴 스 는 다시 생 성 될 수 있 습 니 다. 이 로 인해 데이터 가 손실 될 수 있 습 니 다. 추가 적 인 매개 변수 가 있 는 구조 함수 가 Fragment 를 다시 초기 화 할 때 호출 되 지 않 고 빈 구조 함수 만 호출 되 기 때 문 입 니 다.이 문 제 를 해결 하 는 가장 좋 은 방법 은 정적 구조 방법 인 new Instance () 를 실현 하 는 것 입 니 다. 이 방법 은 새로운 Fragment 인 스 턴 스 를 되 돌려 주 고 setArguments 방법 을 통 해 Fragment 의 인 자 를 설정 합 니 다.
Fragment 의 상 태 는 onSaveInstanceState (Bundle) 방법 으로 저장 할 수 있 습 니 다.이것 은 Activity 와 유사 하 다.데 이 터 는 onCreate (Bundle), onCreate View (LayoutInflater, ViewGroup, Bundle), onActivity Created (Bundle) 또는 onViewState Restored (Bundle) 방법 으로 복원 할 수 있 습 니 다.
Fragment 역시 Activity 예제 를 만 들 때 들 어 오 는 Intent 데 이 터 를 가 져 올 수 있 으 며, getActivity (). getIntent (). getExtras () 방법 으로 가 져 올 수 있 습 니 다.
public class ExampleFragment extends Fragment
{
private static final String ARGUMENT_PRODUCT_ID = "product_id";
private static final String SAVED_LIST_POSITION = "list_position";
public static ExampleFragment newInstance(String productId)
{
ExampleFragment fragment = new ExampleFragment();
// arguments
Bundle arguments = new Bundle();
arguments.putString(ARGUMENT_PRODUCT_ID, productId);
fragment.setArguments(arguments);
return fragment;
}
public ExampleFragment() {}
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
// handle fragment arguments
Bundle arguments = getArguments();
if(arguments != null)
{
handleArguments(arguments);
}
// restore saved state
if(savedInstanceState != null)
{
handleSavedInstanceState(savedInstanceState);
}
// handle intent extras
Bundle extras = getActivity().getIntent().getExtras();
if(extras != null)
{
handleExtras(extras);
}
}
@Override
public void onSaveInstanceState(Bundle outState)
{
// save current instance state
super.onSaveInstanceState(outState);
// TODO
}
private void handleArguments(Bundle arguments)
{
// TODO
}
private void handleSavedInstanceState(Bundle savedInstanceState)
{
// TODO
}
private void handleExtras(Bundle extras)
{
// TODO
}
}
You can find example code also on my GitHub in Android Templates and Utilities repo. This blogpost was inspired by Nick Butcher's post on Google Plus. Gotta some questions or ideas about Bundles? Follow me on Twitter or Google Plus.