我试图在片段创建后立即在其布局中找出某个布局的高度,因为我想在动画中使用它以使其在单击事件中弹出。这是两个动画:
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
与其他内容重叠。
答案 0 :(得分:0)
在onCreateView
中尝试一下:
mEditSetContainer.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
height = mEditSetContainer.getHeight();
//Other operations
}
});