我正在使用ViewPager
和4 Fragment
s作为我的应用的某种介绍/手册。我的问题是当我到达最后一个片段时,它看起来像这样:
当用户点击" Ready" Button
我有一个动画来"崩溃"标题(将其高度改为0px)并做其他一些事情。我的目的是当用户导航到ViewPager的另一个片段时,将视图重置为原始状态("展开"标题)。
要知道用户何时移动到另一个页面,我正在使用setUserVisibleHint
,如下所示:
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
if( !isVisibleToUser) {
// Reset/expand the title's TextView
if(mTitle != null) {
int titlesHeight = mTitle.getMeasuredHeight();
LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) mTitle.getLayoutParams();
params.height = titlesHeight;
mTitle.setLayoutParams(params);
mTitle.invalidate();
mTitle.requestLayout();
}
// Reset other views...
}
}
但这不起作用。
我已尝试setLayoutParams
,invalidate
和requestLayout
的所有可能组合,包括保留一个或多个并更改其顺序,但当用户导航回第四页时,标题仍然崩溃了。
我已经检查过这个方法是否被正确触发,每次titlesHeight != 0
getText
仍然返回"标题"。
我重置了其他视图(我没有为了简单起见而显示),例如我的屏幕截图中显示的Chronometer
,一切都很好。
接口
public interface FragmentAdapterNotificator {
public void fragmentIsVisible();
public void fragmentIsNotVisible();
}
mViewPager.setOnPageChangeListener()
Override
public void onPageSelected(int i) {
FragmentAdapterNotificator fragment = (FragmentAdapterNotificator) mAdapter.instantiateItem(mViewPager, i);
if (fragment != null) {
fragment.fragmentIsVisible();
}
}
片段实现接口
public class FragmentFour extends Fragment implements FragmentAdapterNotificator {
@Override
public void fragmentIsVisible() {
// Reset/expand the title's TextView
if(mTitle != null) {
int titlesHeight = mTitle.getMeasuredHeight();
LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) mTitle.getLayoutParams();
params.height = titlesHeight;
mTitle.setLayoutParams(params);
mTitle.invalidate();
mTitle.requestLayout();
}
}
}
有人知道这里发生了什么?
我想要使用另一个Animation
来扩展标题,因为如果用户在另一个页面中,那么动画高度的恢复就没有意义了,因为用户不会看到它所以我认为在性能方面最好使用"快捷方式"避免动画。
我试过用"扩展"动画仅用于测试,它工作正常,但我不想使用它。
这是我片段的布局:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="@android:color/transparent"
android:clipChildren="false"
android:padding="30dp" >
<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
style="@style/TextTitle"
android:text="@string/tour_four_title" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:clipChildren="false"
android:clipToPadding="false"
android:paddingTop="16dp" >
<Chronometer
android:id="@+id/chronometer"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:textColor="#000000"
android:textSize="30sp" />
<Button
android:id="@+id/ready"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="READY" />
</LinearLayout>
<!-- Some Stuff -->
</LinearLayout>
&#34;收起&#34;用于将标题高度设置为0的动画:
public void collapseView(final View v) {
final int initialHeight = v.getMeasuredHeight();
Animation a = new Animation() {
@Override
protected void applyTransformation(float interpolatedTime, Transformation t) {
if(interpolatedTime == 1){
v.setVisibility(View.GONE);
}else{
v.getLayoutParams().height = initialHeight - (int)(initialHeight * interpolatedTime);
v.requestLayout();
}
}
@Override
public boolean willChangeBounds() {
return true;
}
};
a.setDuration(800);
v.startAnimation(a);
}
&#34;展开&#34;动画:
public void expandView(final View v) {
v.measure(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
final int targetHeight = v.getMeasuredHeight();
v.getLayoutParams().height = 0;
v.setVisibility(View.VISIBLE);
Animation a = new Animation() {
@Override
protected void applyTransformation(float interpolatedTime, Transformation t) {
v.getLayoutParams().height = interpolatedTime == 1
? LayoutParams.WRAP_CONTENT
: (int)(targetHeight * interpolatedTime);
v.requestLayout();
}
@Override
public boolean willChangeBounds() {
return true;
}
};
a.setDuration(1000);
v.startAnimation(a);
}
它与我的&#34;重置&#34;几乎相同方法,但我不知道它为什么不起作用。
答案 0 :(得分:0)
所以基本上,根据我的理解,当用户离开页面时,你希望Title回到原来的高度。而不是为什么不在用户回到原始片段时将其设为默认值。让我解释一下,你点击按钮使标题为0dp,用户导航离开,当他再次来到片段时,标题应该是20dp,对吧?
我想这可以这样做,
在basic_activity(声明viewpager的地方)中创建一个类似
的界面 public interface FragmentInterface{
void Fragmentbecamevisible();
}
现在将setOnPageChangeListener声明为viewPager,
viewPager.setOnPageChangeListener(new OnPageChangeListener() {
@Override
public void onPageSelected(int arg0) {
// TODO Auto-generated method stub
actionBar.setSelectedNavigationItem(arg0);
FragmentInterface frag=(FragmentInterface)mAdapter.instantiateItem(viewPager, arg0);
if(frag!=null)
{
frag.Fragmentbecamevisible();
}
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
// TODO Auto-generated method stub
}
@Override
public void onPageScrollStateChanged(int arg0) {
// TODO Auto-generated method stub
}
});
现在它的作用是,每次用户导航到片段时都会调用此接口函数。
在所有片段中实现接口。 对想要动画发生的片段中的函数进行更改。
所以它会像,
public class Your_Fragment extends Fragment implements FragmentInterface
{
public void Fragmentbecamevisible() {
// TODO Auto-generated method stub
//Do all the things with the TITLE here ..Iv done the same with a button.So you will be able to change the color and height of Title in here
}
}
//Rest of the codes as well
}
因此,每次导航到片段时,用户都会看到原始结构。
希望这种方法有效。
请在需要的地方进行修改。
答案 1 :(得分:0)
感觉非常愚蠢,但在“collapseView”我有这个
if(interpolatedTime == 1){
v.setVisibility(View.GONE);
}
所以我的视图在我的重置方法中调整了大小,但因为它已经GONE我看不到它。我只是修改了它的可见性和瞧:
// Reset/expand the title's TextView
if(mTitle != null) {
int titlesHeight = mTitle.getMeasuredHeight();
LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) mTitle.getLayoutParams();
params.height = titlesHeight;
mTitle.setLayoutParams(params);
mTitle.setVisibility(View.VISIBLE);
}