在ViewPager更改上以编程方式更改TextView的高度

时间:2014-11-17 11:21:23

标签: android resize textview android-viewpager collapse

我正在使用ViewPager和4 Fragment s作为我的应用的某种介绍/手册。我的问题是当我到达最后一个片段时,它看起来像这样:enter image description here

当用户点击" 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...
    }   
}

但这不起作用。

我尝试了什么

我已尝试setLayoutParamsinvalidaterequestLayout的所有可能组合,包括保留一个或多个并更改其顺序,但当用户导航回第四页时,标题仍然崩溃了。 我已经检查过这个方法是否被正确触发,每次titlesHeight != 0 getText仍然返回"标题"。 我重置了其他视图(我没有为了简单起见而显示),例如我的屏幕截图中显示的Chronometer,一切都很好。

onPageSelected和接口

接口

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;几乎相同方法,但我不知道它为什么不起作用。

2 个答案:

答案 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);
}