Fragment布局中的视图在正确的时间没有膨胀?

时间:2018-07-22 15:12:23

标签: android android-fragments android-view

我试图在片段创建后立即在其布局中找出某个布局的高度,因为我想在动画中使用它以使其在单击事件中弹出。这是两个动画:

private void hideEditSetFragment() {
    TranslateAnimation animate = new TranslateAnimation(
            0,                 // fromXDelta
            0,                 // toXDelta
            0,  // fromYDelta
            mEditSetContainer.getHeight());                // toYDelta
    animate.setDuration(500);
   // animate.setFillAfter(true);

    TranslateAnimation animate1 = new TranslateAnimation(0,0,mBottomNavigationView.getHeight(),0);
    animate1.setDuration(500);
   // animate1.setFillAfter(true);
    mBottomNavigationView.startAnimation(animate1);
    mEditSetContainer.startAnimation(animate);
    mBottomNavigationView.setVisibility(View.VISIBLE);
    mEditSetContainer.setVisibility(View.GONE);
}

private void showEditSetFragment() {
    mEditSetContainer.setVisibility(View.INVISIBLE);
    Log.i(TAG, "showEditSetFragment(): mEditSetContainer height is " + mEditSetContainer.getMeasuredHeight());
    TranslateAnimation animate = new TranslateAnimation(
            0,                 // fromXDelta
            0,                 // toXDelta
            mEditSetContainer.getHeight(),  // fromYDelta
            0);                // toYDelta
    animate.setDuration(1000);
    //animate.setFillAfter(true);

    TranslateAnimation animate1 = new TranslateAnimation(0,0,0,mBottomNavigationView.getHeight());
    animate1.setDuration(1000);
    //animate1.setFillAfter(true);
    mBottomNavigationView.startAnimation(animate1);
    mEditSetContainer.startAnimation(animate);
    mBottomNavigationView.setVisibility(View.INVISIBLE);
    mEditSetContainer.setVisibility(View.VISIBLE);
}

问题是我的mEditSetContainer需要绘制至少一次才能在此动画中使用,因为我使用了它的高度。因此,在onCreateView()期间,我将其设置为可见:

@Override
public View onCreateView(LayoutInflater inflater, final ViewGroup container, Bundle onSavedInstanceState) {
    Log.i(TAG, "onCreateView()");
    View v = inflater.inflate(R.layout.fragment_current_workout, container, false);


    v.findViewById(R.id.fragment_current_workout_recycler_view);
    mPerformedExercisesRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
    mEditSetContainer = (ConstraintLayout) v.findViewById(R.id.fragment_current_workout_edit_set_container);
    mEditSetFragment = new EditSetFragment();
    getChildFragmentManager().beginTransaction().replace(R.id.fragment_current_workout_edit_set_container, mEditSetFragment, "EditSetFragment").commit();
    mEditSetContainer.setVisibility(View.VISIBLE);
    mEditSetContainer.post(new Runnable() {
        @Override
        public void run() {
            Log.i(TAG, "Runnable called " + String.valueOf( mEditSetContainer.getHeight()));
            Log.i(TAG, "Runnable called " + String.valueOf( mBottomNavigationView.getHeight()));
            mEditSetContainer.setVisibility(View.GONE);
        }
    });
    return v;
}

我在这里使用了runnable,因为它应该根据此thread被绘制后才被调用。但是,mEditSetContainer的视图仍未绘制mBottomNavigationView的视图。请注意,mEditSetContainer的高度由wrap-content定义,并且它是嵌套片段的容器。我的问题是创建片段时如何获得其高度?我需要知道这一点才能运行我的动画。当前发生的情况是,在第一次单击时,动画会被跳过,但之后会起作用。 This也是一个相关的主题,可能有帮助,但没有帮助。

此外,请不要建议将我的视图设置为不可见。我需要将它们设置为不使用,因为它们在不使用时不应该占用空间。如图所示,mEditSetFragment与其他内容重叠。

1 个答案:

答案 0 :(得分:0)

onCreateView中尝试一下:

mEditSetContainer.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        height = mEditSetContainer.getHeight();
        //Other operations
    }
});