public class MainActivity extends Activity implements MainMenuFragment.OnMainMenuItemSelectedListener {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager
.beginTransaction();
// add menu fragment
MainMenuFragment myFragment = new MainMenuFragment();
fragmentTransaction.add(R.id.menu_fragment, myFragment);
//add content
DetailPart1 content1= new DetailPart1 ();
fragmentTransaction.add(R.id.content_fragment, content1);
fragmentTransaction.commit();
}
public void onMainMenuSelected(String tag) {
//next menu is selected replace existing fragment
}
두 개의 목록보기를 나란히 표시해야합니다. 메뉴는 왼쪽에, 내용은 오른쪽에 있습니다. 기본적으로 첫 번째 메뉴가 선택되고 해당 내용이 오른쪽에 표시됩니다. 콘텐츠를 표시하는 Fragment는 다음과 같습니다.
public class DetailPart1 extends Fragment {
ArrayList<HashMap<String, String>> myList = new ArrayList<HashMap<String, String>>();
ListAdapter adap;
ListView listview;
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
if(savedInstanceState!=null){
myList = (ArrayList)savedInstanceState.getSerializable("MYLIST_obj");
adap = new LoadImageFromArrayListAdapter(getActivity(),myList );
listview.setAdapter(adap);
}else{
//get list and load in list view
getlistTask = new GetALLListTasks().execute();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.skyview_fragment, container,false);
return v;
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putSerializable("MYLIST_obj", myList );
}
}
onActivityCreated 및 onCreateView는 두 번 호출 됩니다 . 조각을 사용하는 많은 예제가 있습니다. 나는이 주제의 초보자이기 때문에 예제를 내 문제와 관련시킬 수 없습니다. 방향 변경을 처리하는 바보 증명 방법이 필요합니다. android:configChanges
매니페스트 파일에 선언하지 않았습니다 . 가로 모드에서 다른 레이아웃을 사용할 수 있도록 활동을 파괴하고 다시 만들어야합니다.
답변
활동에서 화면을 돌릴 때마다 새 조각을 생성 onCreate();
하지만 super.onCreate(savedInstanceState);
. 따라서 태그를 설정하고 존재하는 경우 조각을 찾거나 null 번들을 super에 전달하십시오.
이것은 배우는 데 시간이 오래 걸렸고 뷰 페이저와 같은 작업을 할 때 정말 bi ****가 될 수 있습니다.
이 정확한 주제가 다루어 지므로 추가 시간 에 조각 에 대해 읽는 것이 좋습니다 .
다음은 일반적인 방향 변경시 조각을 처리하는 방법의 예입니다.
활동 :
public class MainActivity extends FragmentActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (savedInstanceState == null) {
TestFragment test = new TestFragment();
test.setArguments(getIntent().getExtras());
getSupportFragmentManager().beginTransaction().replace(android.R.id.content, test, "your_fragment_tag").commit();
} else {
TestFragment test = (TestFragment) getSupportFragmentManager().findFragmentByTag("your_fragment_tag");
}
}
}
조각 :
public class TestFragment extends Fragment {
public static final String KEY_ITEM = "unique_key";
public static final String KEY_INDEX = "index_key";
private String mTime;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_layout, container, false);
if (savedInstanceState != null) {
// Restore last state
mTime = savedInstanceState.getString("time_key");
} else {
mTime = "" + Calendar.getInstance().getTimeInMillis();
}
TextView title = (TextView) view.findViewById(R.id.fragment_test);
title.setText(mTime);
return view;
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString("time_key", mTime);
}
}
답변
방향 변경과 활동 레크리에이션 사이에 데이터를 유지하는 방법에 대한 좋은 지침은 안드로이드 지침에서 찾을 수 있습니다 .
요약:
-
조각을 유지 가능하게 만드십시오.
setRetainInstance(true);
-
필요한 경우에만 새 조각을 만듭니다 (또는 최소한 여기에서 데이터 가져 오기).
dataFragment = (DataFragment) fm.findFragmentByTag("data"); // create the fragment and data the first time if (dataFragment == null) {