레이아웃을 프로그래밍 방식으로 구현하는 조각을 액티비티에 추가하고 싶습니다. 프래그먼트 문서를 살펴봤지만 필요한 것을 설명하는 예제가 많지 않습니다. 제가 작성하려고 했던 코드 유형은 다음과 같습니다:
public class DebugExampleTwo extends Activity {
private ExampleTwoFragment mFragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
FrameLayout frame = new FrameLayout(this);
if (savedInstanceState == null) {
mFragment = new ExampleTwoFragment();
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.add(frame.getId(), mFragment).commit();
}
setContentView(frame);
}
}
...
public class ExampleTwoFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater,
ViewGroup container,
Bundle savedInstanceState) {
Button button = new Button(getActivity());
button.setText("Hello There");
return button;
}
}
이 코드는 컴파일되지만 시작 시 충돌이 발생합니다. 아마도 FragmentTransaction.add()
가 올바르지 않기 때문일 것입니다. 이 작업을 수행하는 올바른 방법은 무엇인가요?
해당 코드에는 한 가지 이상의 문제가 있는 것으로 나타났습니다. 조각은 활동과 동일한 자바 파일 내에서 공개 내부 클래스가 아닌 다른 방식으로 선언할 수 없습니다. 프레임워크는 조각의 생성자(매개 변수 없음)가 공개적이고 표시될 것으로 예상합니다. 조각을 내부 클래스로 활동으로 이동하거나 조각에 대한 새 자바 파일을 만들면 이 문제가 해결됩니다.
두 번째 문제는 이러한 방식으로 조각을 추가할 때 조각이 포함된 보기에 대한 참조를 전달해야 하며 해당 보기에 사용자 지정 ID가 있어야 한다는 것입니다. 기본 ID를 사용하면 앱이 충돌합니다. 다음은 업데이트된 코드입니다:
public class DebugExampleTwo extends Activity {
private static final int CONTENT_VIEW_ID = 10101010;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
FrameLayout frame = new FrameLayout(this);
frame.setId(CONTENT_VIEW_ID);
setContentView(frame, new LayoutParams(
LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
if (savedInstanceState == null) {
Fragment newFragment = new DebugExampleTwoFragment();
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.add(CONTENT_VIEW_ID, newFragment).commit();
}
}
public static class DebugExampleTwoFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
EditText v = new EditText(getActivity());
v.setText("Hello Fragment!");
return v;
}
}
}
다음은 토니 웡의 댓글을 읽은 후 제가 생각해낸 내용입니다:
public class DebugExampleTwo extends BaseActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addFragment(android.R.id.content,
new DebugExampleTwoFragment(),
DebugExampleTwoFragment.FRAGMENT_TAG);
}
}
...
public abstract class BaseActivity extends Activity {
protected void addFragment(@IdRes int containerViewId,
@NonNull Fragment fragment,
@NonNull String fragmentTag) {
getSupportFragmentManager()
.beginTransaction()
.add(containerViewId, fragment, fragmentTag)
.disallowAddToBackStack()
.commit();
}
protected void replaceFragment(@IdRes int containerViewId,
@NonNull Fragment fragment,
@NonNull String fragmentTag,
@Nullable String backStackStateName) {
getSupportFragmentManager()
.beginTransaction()
.replace(containerViewId, fragment, fragmentTag)
.addToBackStack(backStackStateName)
.commit();
}
}
...
public class DebugExampleTwoFragment extends Fragment {
public static final String FRAGMENT_TAG =
BuildConfig.APPLICATION_ID + ".DEBUG_EXAMPLE_TWO_FRAGMENT_TAG";
// ...
}
Kotlin을 사용하는 경우 Google에서 제공하는 Kotlin 확장 기능을 살펴보거나 직접 작성해 보세요.
public class Example1 extends FragmentActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
DemoFragment fragmentDemo = (DemoFragment)
getSupportFragmentManager().findFragmentById(R.id.frame_container);
//above part is to determine which fragment is in your frame_container
setFragment(fragmentDemo);
(OR)
setFragment(new TestFragment1());
}
// This could be moved into an abstract BaseActivity
// class for being re-used by several instances
protected void setFragment(Fragment fragment) {
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction =
fragmentManager.beginTransaction();
fragmentTransaction.replace(android.R.id.content, fragment);
fragmentTransaction.commit();
}
}
>. 조각은 추가할 붙여넣습니다 작업또는 프레이망스티비티 필요합니다 >. 컨테이너입니다. 있어야 할 수 있는 ',' 해당 컨테이너입니다 " 프라메라리우스 ". >. 그렇지 않으면 그 기본 컨테이너입니다 xml 에 사용할 수 있습니다. >. ',' 같은 " 안드로이드리스터리d.콘텐토 ". 조각은 바꾸거나 제거할 수 있는 >. 활동까지입니다.
맹.1믈
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent" >
<!-- Framelayout to display Fragments -->
<FrameLayout
android:id="@+id/frame_container"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<ImageView
android:id="@+id/imagenext"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:layout_margin="16dp"
android:src="@drawable/next" />
</RelativeLayout>
세련된 방법으로 답을 다 읽고 난 후 지었지.
public class MyActivity extends ActionBarActivity {
Fragment fragment ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
FragmentManager fm = getSupportFragmentManager();
fragment = fm.findFragmentByTag("myFragmentTag");
if (fragment == null) {
FragmentTransaction ft = fm.beginTransaction();
fragment =new MyFragment();
ft.add(android.R.id.content,fragment,"myFragmentTag");
ft.commit();
}
}
중요: , t fragment don& # 39 로 교체를 사용할 경우를 제외하고는 대부분 이 슬라이드에서는 외곽진입 don& 마음 상태 변수 중 오노레크레이션 # 39, t fragment 손실됩니다 인스턴스입니다 과정이다.
public abstract class SingleFragmentActivity extends Activity {
public static final String FRAGMENT_TAG = "single";
private Fragment fragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState == null) {
fragment = onCreateFragment();
getFragmentManager().beginTransaction()
.add(android.R.id.content, fragment, FRAGMENT_TAG)
.commit();
} else {
fragment = getFragmentManager().findFragmentByTag(FRAGMENT_TAG);
}
}
public abstract Fragment onCreateFragment();
public Fragment getFragment() {
return fragment;
}
}
사용
public class ViewCatalogItemActivity extends SingleFragmentActivity {
@Override
public Fragment onCreateFragment() {
return new FragmentWorkShops();
}
}