Подтвердить что ты не робот

OnClickListener of Child, предотвращающий прокрутку Android ViewPager

Я использую ViewPager с динамическими представлениями, как показано в этой ссылке. Я добавляю каждую страницу в 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 не вызывается. Если я нажму на текстовое представление, вызывается событие click. Я не могу понять, почему viewpager не переворачивает страницы, если салфетка начинается с текстового представления с событием клика.

Чтобы узнать причину ошибки, я добавил ontouchlistener в viewpager и обнаружил, что событие касания viewpager вызывается, когда салфетки происходят со стороны страницы, где нет текстового вида, и событие касания не вызывается вообще, если салфетки начинаются поверх текстового вида. Если я удалю onclicklistener текстового поля, то весь viewpager правильно перевернется без каких-либо проблем. Таким образом, проблема в том, что событие click textview останавливает события касания на viewpager. Скажите, пожалуйста, что я делаю что-то не так в моем коде страницы создания. Представление, которое я создаю в этой функции, добавляется в viewpager через страницу, как показано в учебнике, упомянутом в начале.

4b9b3361

Ответ 1

Наконец, я обнаружил, что в последней версии ViewPager есть ошибка в том, что TextView с событием click, singleLine, установленным как true и gravity, установленным как центр, не передает события касания к ViewPager, если палец перемещается, начиная с в верхней части текста. Если мы сделаем singleLine ложным или удалим центр тяжести, тогда события будут переданы в ViewPager, после чего он может бежать. Мы не можем использовать как центр тяжести, так и setinterline (true) для текстового представления или кнопку с sinlgeline, установленную как true. Я сообщил об этом как об ошибке здесь

См. источник "применить одну строку" здесь: https://github.com/android/platform_frameworks_base/blob/7bfb1e7f46d2ed3df6cc467bccec95b5999d9cc4/core/java/android/widget/TextView.java#L7877

Ответ 2

Кажется, что есть какое-то решение: вы можете использовать setMaxLines(1) вместо setSingleLine(), и он будет работать без ущерба для системы. Однако я могу подтвердить ваш предыдущий ответ, в котором вы говорите это ошибка