繁体   English   中英

当替换为第二个片段时,第一个片段上的按钮移出屏幕

[英]Button on first fragment moves out of screen when replaced with second fragment

我正在尝试在Activity上使用多个Fragment 我正在做的是:1.将第一个Fragment添加到Activity 第一个Fragment在屏幕底部包含一个按钮。 2.通过将其添加到后堆栈,用第二个Fragment替换它。

当我单击第一个Fragment底部的按钮时,它会自动向上滑动(我不知道为什么)并移动到第二个Fragment

img1

当我通过按“后退”按钮返回到第一个Fragment ,第一个Fragment的按钮不Fragment

img2

主要活动

public class MainActivity extends AppCompatActivity implements UserDetailsFragment.UserDetailsFragmentListener,
        PhotoFragment.PhotoFragmentListener, TestFragment.TestFragmentListener{

@Bind(R.id.container)
FrameLayout frameLayout;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_create_profile);
    ButterKnife.bind(this);


    // However, if we're being restored from a previous state,
    // then we don't need to do anything and should return or else
    // we could end up with overlapping fragments.
    if (savedInstanceState != null) {
        return;
    }

    initView();
}

private void initView() {

    TestFragment testFragment = new TestFragment();

    FragmentUtil.replaceFragment(this,R.id.container, testFragment);
}

@Override
public void onProfileDetailCompleted(UserModel userModel) {
    PhotoFragment photoFragment = PhotoFragment.newInstance(userModel);
    FragmentUtil.replaceFragment(this, R.id.container, photoFragment);
}

@Override
public void onPhotoUploaded(UserModel userModel) {

}

@Override
public void onSkipPhotoClicked() {
    PhotoFragment photoFragment = PhotoFragment.newInstance(null);
    FragmentUtil.replaceFragment(this, R.id.container, photoFragment);
}

@Override
public void onTest() {
    PhotoFragment photoFragment = PhotoFragment.newInstance(null);
    FragmentUtil.replaceFragment(this, R.id.container, photoFragment);
}

}

TestFragment.java

public class TestFragment extends BaseFragment {


public TestFragment() {
    // Required empty public constructor
}

public interface TestFragmentListener {
    void onTest();
}

private TestFragmentListener mListener;


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View view = inflater.inflate(R.layout.fragment_test, container, false);
    ButterKnife.bind(this, view);
    return view;
}

@OnClick(R.id.next_btn)
public void onNextButtonClicked() {
    //TODO validate view


    if(mListener!=null)
        mListener.onTest();
}



@Override
public void onAttach(Context context) {
    super.onAttach(context);
    if (context instanceof TestFragmentListener) {
        mListener = (TestFragmentListener) context;
    } else {
        throw new RuntimeException(context.toString()
                + " must implement TestFragmentListener");
    }
}

}

FragmentUtils.java

public class FragmentUtil {

public static boolean hadFragment(AppCompatActivity activity) {
    return activity.getSupportFragmentManager().getBackStackEntryCount() != 0;
}

public static void replaceFragment(AppCompatActivity activity, int contentId, BaseFragment fragment) {
    FragmentTransaction transaction = activity.getSupportFragmentManager().beginTransaction();

    transaction.setCustomAnimations(R.anim.slide_left_in, R.anim.slide_left_out);
    if (hadFragment(activity)) {
        transaction.replace(contentId, fragment, fragment.getClass().getSimpleName());
    } else {
        transaction.add(contentId, fragment, fragment.getClass().getSimpleName());
    }

    transaction.addToBackStack(null);
    transaction.commit();
}

public static void removeFragment(AppCompatActivity activity, BaseFragment fragment) {
    activity.getSupportFragmentManager().beginTransaction()
        .remove(fragment)
        .commit();
}


public static void showFragment(AppCompatActivity activity, BaseFragment fragment) {
    activity.getSupportFragmentManager().beginTransaction()
        .show(fragment)
        .commit();
}

public static void hideFragment(AppCompatActivity activity, BaseFragment fragment) {
    activity.getSupportFragmentManager().beginTransaction()
        .hide(fragment)
        .commit();
}

public static void attachFragment(AppCompatActivity activity, BaseFragment fragment) {
    activity.getSupportFragmentManager().beginTransaction()
        .attach(fragment)
        .commit();
}

public static void detachFragment(AppCompatActivity activity, BaseFragment fragment) {
    activity.getSupportFragmentManager().beginTransaction()
        .detach(fragment)
        .commit();
}

}

如果我从第二个Fragment移到第三个Fragment (与第一个Fragment相同),则第二个屏幕底部的按钮看起来会很好。 但是第一个“ Fragment上的按钮仍然不Fragment 该问题仅存在于第一个Fragment的视图中。 请帮忙。

我有类似的问题。 我正在使用appcompact主题,当我替换片段时,我的底部布局不在屏幕上。 然后我尝试了不同的主题,之后效果很好。 因此,如果您还使用App Compact主题,请尝试其他主题。 希望它能解决您的问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM