PagerView 与 PagerTabStrip / PagerTitleStrip 重叠问题

3
我已经尝试了一个星期来避免我的PagerView与TitleStrip重叠。
我尝试了我能想到的所有方法,还参考了一个看起来相同的问题的StackOverflow问答,但是其中的答案并不适用于我。
似乎PagerTitleStrip和TextView都从0,0(左上角)开始。
如果有帮助,将不胜感激。请注意,我不能使用任何XML(包括Layout.xml),所以一切都是通过编程完成的。
以下是我的问题的完整工作示例:
package com.example.projname;

import android.app.Activity;
import android.os.Bundle;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.PagerTabStrip;
import android.support.v4.view.ViewPager;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.widget.TextView;

public class MainActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        MyPagerAdapter myPagerAdapter = new MyPagerAdapter();
        PagerTabStrip myPagerTabStrip = new PagerTabStrip(this);
        myPagerTabStrip.setGravity(Gravity.TOP);
        ViewPager viewPager = new ViewPager(this);
        viewPager.addView(myPagerTabStrip, LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
        viewPager.setAdapter(myPagerAdapter);
        setContentView(viewPager);
    }

    class MyPagerAdapter extends PagerAdapter {
        public final String[] Titles = {
            "Title One",
            "Title Two",
            "Title Three",
            "Title Four",
            "Title Five"
        };

        @Override
        public int getCount() {
            return Titles.length;
        }

        @Override
        public boolean isViewFromObject(View view, Object object) {
            return (view == object);
        }

        @Override
        public CharSequence getPageTitle(int position) {
            return Titles[position];
        }

        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            TextView textView = new TextView(getApplicationContext());
            String myString = new String("Page " + (position + 1) + "\r\n");
            textView.setText(myString + myString + myString + myString + myString + myString);
            container.addView(textView);
            return textView;
        }

        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            container.removeView((View) object);
        }
    }
}

编辑1: 添加问题截图: 页面显示的文本Page1比应该的高得多

编辑2: 更新问题并附上答案(以防未来有人尝试此方法)

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    LayoutParams layoutParams = new LayoutParams();
    layoutParams.height = LayoutParams.WRAP_CONTENT;
    layoutParams.width = LayoutParams.MATCH_PARENT;
    layoutParams.gravity = Gravity.TOP;
    PagerTabStrip myPagerTabStrip = new PagerTabStrip(this);
    MyPagerAdapter myPagerAdapter = new MyPagerAdapter();       
    ViewPager viewPager = new ViewPager(this);
    viewPager.addView(myPagerTabStrip, layoutParams);
    viewPager.setAdapter(myPagerAdapter);
    setContentView(viewPager);
}

一般来说,答案不应该出现在问题中。我建议您要么添加自己的答案,要么编辑已接受的答案以包含实际解决方案。 - Dave Newton
1个回答

2
请注意,我无法使用任何XML。
为什么?
如果不行,请尝试使用一个接受LayoutParams对象作为参数的addView()版本,并使用ViewPager.LayoutParams的实例。此外,请使用ViewPager.LayoutParams上的gravity字段而不是setGravity()。
如果这样做没有帮助,请在XML中暂时设置一个ViewPager和PagerTitleStrip(例如,在一个单独的项目中),并在Hierarchy View中检查结果,以了解XML方法如何构造事物,以便您可以尝试复制它。

我尝试在XML中设置ViewPager和PagerTitleStrip,但除了mPrivateFlags ONLY_DRAWS_BACKGROUND和OPAQUE_BACKGROUND之外,我看不到任何区别。使用.setAlpha(1f)更改OPAQUE_BACKGROUND标志没有改变任何内容,而且我不确定如何将ONLY_DRAWS_BACKGROUND标志更改为1(就像XML一样),尽管我想知道这是否只是一个临时标志。 - JD Byrnes
@user1256169:我相当有信心这与背景无关。你也没有解释为什么不采用使用XML布局源设置这个简单的解决方案。 - CommonsWare
对我来说使用XML没有意义,因为我的大多数视图都是动态创建的(目前我的应用程序甚至没有res/layout文件夹)。 肯定有一种简单的方法可以解决这个问题,我可能忽略了什么。我将尝试在XML和编程方式下各做一半,以便确定是容器(ViewPager)还是PagerTabStrip(值得注意的是,使用PagerTitleStrip时也会出现相同的情况)。 - JD Byrnes
1
@user1256169:“对我来说,使用XML没有意义,因为我的大多数视图都是动态创建的”--你当然可以这样做。不过,不要期望得到太多关于这种技术的帮助,因为只有极少数的Android开发者采用这种方法。 - CommonsWare
这是一个公正的评价,但我正在缩小问题范围。看起来你第一次的建议可能非常准确。如果我使用XML布局,然后使用viewPager.removeAllViews()删除视图,再使用相同的addView(...)重新添加它,我会遇到同样的问题。现在尝试按照您上面指示的方式操作。 - JD Byrnes
你说得对。使用设置了Gravity的LayoutParams的AddView解决了我的困境。 谢谢@CommonsWare-更新问题以指示其他读者的答案。 - JD Byrnes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接