2012-09-07 79 views
12

我正在使用具有动态视图的ViewPager,如此link中所示。我将每个页面添加到viewpager。该代码创建的每个页面,并把它添加到寻呼机适配器是在页面的TextView如下儿童的OnClickListener防止Android 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;   
} 

的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的touch事件如果滑动从文本视图开始,则根本不会被调用。如果我删除了textview的onclicklistener,那么整个viewpager会正常翻转而不会出现任何问题。所以问题在于textview的click事件正在停止viewpager的触摸事件。请告诉我,如果我在我的创建页面代码中做错了什么。我在这个函数中创建的视图通过pageadapter添加到viewpager,如我在开头提到的教程中所示。

回答

22

最后,我发现最新版本的ViewPager中存在一个错误,其中带有单击事件的singletext,singleLine被设置为true,并且重心被设置为中心,如果手指移动,则不会将触摸事件传递给ViewPager在textview的顶部。如果我们将singleLine设置为false或删除中心引力,那么事件将传递给ViewPager,然后它可以投掷。对于textview或sinlgeline设置为true的按钮,我们不能同时使用中心引力和setsingleline(true)。我已经报告这个bug here

请参阅“申请单行”源位置:https://github.com/android/platform_frameworks_base/blob/7bfb1e7f46d2ed3df6cc467bccec95b5999d9cc4/core/java/android/widget/TextView.java#L7877

+0

非常感谢你的研究和发布这个,我以为我疯了一会儿...... – avalancha

+0

谢谢!我正在寻找这一整天的原因...... –

+0

singleLine =“true”已被弃用。使用maxLine =“1”而不是 –

4

似乎存在着一定程度上的解决方案:你可以使用setMaxLines(1),而不是setSingleLine(),它会在不损害工作系统。不过,我可以确认你的previous answer,你说这是一个bug