我试图在片段的布局中找到某个布局的高度,因为我想在动画中使用它,使其在点击事件中弹出。这是两个动画:
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,因为它应该在根据这个线程绘制后被调用。然而,当mBottomNavigationView
的视图为时,仍然没有为mEditSetContainer
绘制视图。需要注意的是,mEditSetContainer
的高度由包装内容定义,并且它是嵌套片段的容器。我的问题是,当碎片被创建时,我如何获得它的高度?我需要知道这一点,才能运行我的动画。目前发生的情况是,在第一次单击时,动画会被跳过,但在之后可以工作。这也是一个相关的线程,可能会有所帮助,但没有。
此外,请不要建议将我的观点设置为不可见。我需要把它们准备好,因为它们不使用时不应该占用空间。mEditSetFragment
在显示时与其他内容重叠。
在onCreateView
:中尝试此操作
mEditSetContainer.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
height = mEditSetContainer.getHeight();
//Other operations
}
});