【问题标题】:OnClickListener of Child preventing the swipe of Android ViewPagerChild的OnClickListener防止Android ViewPager的滑动
【发布时间】:2012-09-07 17:08:03
【问题描述】:

我正在使用带有动态视图的 ViewPager,如 link 所示。我正在将每个页面添加到 viewpager。创建每个页面并将其添加到寻呼机适配器的代码如下

public View createPage( )
{   
TableLayout table = new TableLayout(mycontext);
TableRow row = new TableRow(mycontext);

for(int i=0; i <= num_of_views; i++)
{

        TableLayout catTable = new TableLayout(mycontext);

        TableLayout.LayoutParams params = new TableLayout.LayoutParams();   

        params.height = LayoutParams.MATCH_PARENT;

        TableRow catName = new TableRow(mycontext);
        catName.setGravity(0x03);
        catName.setLayoutParams(params);

        TextView cat = new TextView(mycontext);
        TableRow.LayoutParams RowParams= 
            new TableRow.LayoutParams(pixeltoDp(0),pixeltoDp(85));
        RowParams.weight = 1;
        cat.setLayoutParams(RowParams);
        cat.setPadding(35, 0, 5, 0);
        cat.setGravity(0x13);
        cat.setSingleLine(true);
        cat.setHorizontallyScrolling(true);
        cat.setFocusable(true);
        cat.setFocusableInTouchMode(true);
        cat.setLines(1);
        cat.setText(data.getCats().get(i).getName());
        cat.setTextColor(color);
        cat.setSelected(true);

        catName.addView(cat);
        catTable.addView(catName);
        for(int j=0; j < 5; j++)
        {
            TableRow trChild = new TableRow(mycontext);
            trChild.setLayoutParams(params);
            trChild.setGravity(0x11);
            for (int k=0; k<4; k++)
            {
                TextView app = new TextView(mycontext);
                TableRow.LayoutParams tableRowParams= 
                    new     TableRow.LayoutParams(pixeltoDp(0),pixeltoDp(80));
                margin = pixeltoDp(11);

                tableRowParams.weight = 1;
                app.setLayoutParams(tableRowParams);

                app.setGravity(0x11);
                app.setSingleLine(true);
                app.setTextSize(pixeltoDp(12));
                app.setTextColor(Color.BLACK);
                app.setTypeface(verdana);


                int pos = j+(k*5);
                if((pos < mysize))
                {
                        Drawable icon = getMyDrawable();

                        app.setCompoundDrawablesWithIntrinsicBounds(null, icon, null, null);
                        app.setText("some Name");
                        app.setTag(i+":"+pos);
                        app.setEllipsize(TextUtils.TruncateAt.END);
                        app.setOnClickListener(onMyClick);

                }

                trChild.addView(app);
            }
            catTable.addView(trChild);              
        }   
        TableRow.LayoutParams tableRowParams=
              new TableRow.LayoutParams
                  (TableRow.LayoutParams.MATCH_PARENT,TableRow.LayoutParams.WRAP_CONTENT);
        margin = pixeltoDp(5);
        tableRowParams.setMargins(margin,0,margin, pixeltoDp(18));
        catTable.setLayoutParams(tableRowParams);       
}           
row.setGravity(0x03);
table.addView(row);     
return table;           
}

页面中textview的OnClickListener如下

    private View.OnClickListener onAppClick=new View.OnClickListener() {
    public void onClick(View v) {
        // TODO Auto-generated method stub
        String gettext = (String)v.getTag();
        String[] splittext = gettext.split(":");

        Log.d("TAG","Click Event is Triggered");
    }
};

我面临的问题是,当我在屏幕上滑动时,viewpager 会滑动,但是如果我的手指从带有 onclicklistener 的文本开始滑动,则页面不会滑动,也不会调用 click 事件。如果我单击文本视图,则会调用单击事件。如果从带有点击事件的文本视图开始滑动,我无法弄清楚为什么 viewpager 不翻页。

为了找出错误的原因,我在 viewpager 中添加了一个 ontouchlistener,发现当在没有文本视图的页面部分发生滑动时调用 viewpager 的触摸事件,并且触摸事件是如果从文本视图顶部开始滑动,则根本不会调用。如果我删除了 textview 的 onclicklistener,那么整个 viewpager 会正确翻转而不会出现任何问题。所以问题是textview的点击事件正在停止viewpager的触摸事件。如果我在创建页面代码中做错了什么,请告诉我。我在此函数中创建的视图通过 pageadapter 添加到 viewpager,如我在开头提到的教程中所示。

【问题讨论】:

    标签: android android-viewpager onclicklistener


    【解决方案1】:

    最后我发现在最新版本的 ViewPager 中存在一个错误,如果手指开始移动,则带有 click 事件、singleLine 设置为 true 且重力设置为 center 的 TextView 不会将触摸事件传递给 ViewPager文本视图的顶部。如果我们将 singleLine 设置为 false 或移除中心重心,则事件将传递给 ViewPager,然后它就可以抛出。我们不能将中心重心和 setsingleline(true) 用于 textview 或将 sinlgeline 设置为 true 的按钮。我已将此报告为错误here

    在此处查看“应用单行”源:https://github.com/android/platform_frameworks_base/blob/7bfb1e7f46d2ed3df6cc467bccec95b5999d9cc4/core/java/android/widget/TextView.java#L7877

    【讨论】:

    • 非常感谢你研究和发布这个,我以为我在那里疯了一段时间......
    • singleLine = "true" 已弃用。改用 maxLine = "1"
    • @Pops 我努力解决这个问题...非常感谢!
    • 注意:maxLinessingleLine 并不完全相同。 stackoverflow.com/questions/30879471/…
    【解决方案2】:

    似乎有一些解决方案:您可以使用setMaxLines(1) 而不是setSingleLine(),它会在不损害系统的情况下工作。不过我可以确认你的previous answer,你说它是bug

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-05
      • 1970-01-01
      相关资源
      最近更新 更多