50

Здесь у меня есть одна активность пейджера в представлении, которая имеет один просмотр изображений и 2 оверлейных бара. есть оверлейные бары, которые я сделал с использованием самой компоновки файла xroid.Как отключить отслеживание по клику в событии Framelayout

Вот мое требование, как этот

1) одним нажатием на ImageView первый раз = шоу Вид сверху пейджера и нижний прямоугольник overlaybar. 2) однократное нажатие на просмотр изображения пейджера второй раз = скрыть эти оверлеи.

Эти функции являются функциями типа android gallary view.

Но здесь, когда отображаются эти верхние и нижние панели макета, я хочу использовать только кнопки, только кнопки, которые объявляются в этом макете.

Но я не добился успеха в достижении этой цели.

Проблемы

1), когда top or bottom bar есть, если я могу нажать на кнопку next or previous, чем его принимает событие для за ImageView одним касанием сенсорного события, и мой бар становится невидимым. 2) Только хочет объявлять только кнопки события 3) Избегайте получения изображения, когда я касаюсь оверлейной панели.

Вкратце, когда появляется верхняя и нижняя панель изображений, в настоящее время не отображается событие touh для просмотра изображений сверху и снизу. Я могу нажать на изображение, но не делать кликабельными, когда нажимаю на кнопку «Далее» или «предыдущая» или «Поделиться».

Итак, это проблемы, с которыми я столкнулся, пожалуйста, помогите мне.

Исходный код:

activity_pager_image.xml

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 

    <android.support.v4.view.ViewPager 
     android:id="@+id/pager" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" /> 

    <RelativeLayout 
     android:id="@+id/rl_top_overlay" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:background="@drawable/slideshow_bar" 
     android:visibility="gone" > 

     <TextView 
      android:id="@+id/tv_top_overlay" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_centerHorizontal="true" 
      android:layout_centerVertical="true" 
      android:textIsSelectable="false" /> 
    </RelativeLayout> 

    <RelativeLayout 
     android:id="@+id/rl_bottom_overlay" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_gravity="bottom" 
     android:background="@drawable/slideshow_bar" 
     android:visibility="visible" > 

     <Button 
      android:id="@+id/btn_left_arrow" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_alignParentLeft="true" 
      android:layout_centerVertical="true" 
      android:layout_marginLeft="35dp" 
      android:background="@drawable/ic_left_arrow" /> 

     <Button 
      android:id="@+id/btn_below_share" 
      style="@style/normalText" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_alignParentRight="true" 
      android:layout_centerVertical="true" 
      android:layout_marginRight="35dp" 
      android:background="@drawable/ic_share" 
      android:visibility="visible" /> 

     <Button 
      android:id="@+id/btn_right_arrow" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_centerHorizontal="true" 
      android:layout_centerVertical="true" 
      android:layout_marginLeft="50dp" 
      android:layout_toRightOf="@id/btn_left_arrow" 
      android:background="@drawable/ic_right_arrow" /> 
    </RelativeLayout> 

</FrameLayout> 

item_pager_image.xml

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 

    <demo.android.library.imagezoom.ImageViewTouch 
     android:id="@+id/image" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:adjustViewBounds="true" 
     android:contentDescription="@string/descr_image" 
     android:scaleType="fitXY" /> 

</FrameLayout> 

JAVA код

public class ImagePagerActivity extends BaseActivity { 

    private static final String STATE_POSITION = "STATE_POSITION"; 
    private DisplayImageOptions options; 
    private String[] imageUrls; 
    private ViewPager pager; 

    private static int sCounter = 0; 

    private RelativeLayout mRlTopOverlayBar = null; 
    private RelativeLayout mRlBottomOverlayBar = null; 
    private TextView mPageNumberText = null; 
    private Button mLeftArrow = null; 
    private Button mRightArrow = null; 

    int mPageCounter = 0; 
    int mTotalImages = 0; 

    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_image_pager); 

     mRlTopOverlayBar = (RelativeLayout) findViewById(R.id.rl_top_overlay); 
     mRlBottomOverlayBar = (RelativeLayout) findViewById(R.id.rl_bottom_overlay); 

     mPageNumberText = (TextView) findViewById(R.id.tv_top_overlay); 
     mLeftArrow = (Button) findViewById(R.id.btn_left_arrow); 
     mRightArrow = (Button) findViewById(R.id.btn_right_arrow); 

     Bundle bundle = getIntent().getExtras(); 
     String[] imageUrls = bundle 
       .getStringArray(Constants.GALLARY_IMAGES_IMAGE_BUNDLE_KEY); 

     mTotalImages = imageUrls.length; 

     mPageCounter = bundle.getInt(
       Constants.GALLARY_IMAGE_POSITION_BUNDLE_KEY, 0); 

     Log.d("TAG", "Pre Poistion " + mPageCounter); 

     if (savedInstanceState != null) { 
      mPageCounter = savedInstanceState.getInt(STATE_POSITION); 
     } 

     options = new DisplayImageOptions.Builder() 
       .showImageForEmptyUri(R.drawable.photo_default) 
       .showImageOnFail(R.drawable.ic_error).resetViewBeforeLoading() 
       .cacheOnDisc().imageScaleType(ImageScaleType.EXACTLY) 
       .bitmapConfig(Bitmap.Config.RGB_565) 
       .displayer(new FadeInBitmapDisplayer(300)).build(); 

     pager = (ViewPager) findViewById(R.id.pager); 
     pager.setAdapter(new ImagePagerAdapter(imageUrls)); 
     pager.setCurrentItem(mPageCounter); 

     mLeftArrow.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       // int setCounter = mPageCounter - 1; 
       // if (setCounter >= 0) { 

       // } 
       pager.setCurrentItem(pager.getCurrentItem() - 1); 

      } 
     }); 

     mRightArrow.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       pager.setCurrentItem(pager.getCurrentItem() + 1); 
       /* 
       * int setCounter = mPageCounter + 1; if (setCounter < 
       * mTotalImages) { pager.setCurrentItem(mPageCounter + 1); } 
       */ 
      } 
     }); 
    } 

    @Override 
    public void onSaveInstanceState(Bundle outState) { 
     outState.putInt(STATE_POSITION, pager.getCurrentItem()); 
    } 

    private class ImagePagerAdapter extends PagerAdapter { 

     private String[] images; 
     private LayoutInflater inflater; 

     ImagePagerAdapter(String[] images) { 
      this.images = images; 
      inflater = getLayoutInflater(); 
     } 

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

     @Override 
     public void finishUpdate(View container) { 
     } 

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

     @Override 
     public Object instantiateItem(ViewGroup view, int position) { 
      View imageLayout = inflater.inflate(R.layout.item_pager_image, 
        view, false); 

      Log.d("TAG", "Poistion " + position); 
      final ImageViewTouch imageView = (ImageViewTouch) imageLayout 
        .findViewById(R.id.image); 

      final DeactivableViewPager viewPager = new DeactivableViewPager(
        ImagePagerActivity.this); 
      imageView.setOnScaleListener(new OnPageScaleListener() { 

       @Override 
       public void onScaleBegin() { 
        viewPager.deactivate(); 
       } 

       @Override 
       public void onScaleEnd(float scale) { 
        if (scale > 1.0) { 
         viewPager.deactivate(); 
        } else { 
         viewPager.activate(); 
        } 
       } 
      }); 

      imageView 
        .setSingleTapListener(new OnImageViewTouchSingleTapListener() { 

         @Override 
         public void onSingleTapConfirmed() { 
          Log.d("TAG", "setSingleTapListener"); 

          sCounter++; 
          if (sCounter % 2 == 0) { 
           mRlTopOverlayBar.setVisibility(View.GONE); 
           mRlBottomOverlayBar.setVisibility(View.GONE); 
          } else { 
           mRlTopOverlayBar.setVisibility(View.VISIBLE); 
           mRlBottomOverlayBar.setVisibility(View.VISIBLE); 
           mRlBottomOverlayBar.setClickable(false); 
           mRlTopOverlayBar.setClickable(false); 
          } 
         } 
        }); 

      imageLoader.displayImage(images[position], imageView, options, 
        new SimpleImageLoadingListener() { 
         @Override 
         public void onLoadingStarted(String imageUri, View view) { 
          // spinner.setVisibility(View.VISIBLE); 
         } 

         @Override 
         public void onLoadingFailed(String imageUri, View view, 
           FailReason failReason) { 
          String message = null; 
          switch (failReason.getType()) { 
          case IO_ERROR: 
           message = "Input/Output error"; 
           break; 
          case DECODING_ERROR: 
           message = "Image can't be decoded"; 
           break; 
          case NETWORK_DENIED: 
           message = "Downloads are denied"; 
           break; 
          case OUT_OF_MEMORY: 
           message = "Out Of Memory error"; 
           break; 
          case UNKNOWN: 
           message = "Unknown error"; 
           break; 
          } 
          Toast.makeText(ImagePagerActivity.this, message, 
            Toast.LENGTH_SHORT).show(); 

          // spinner.setVisibility(View.GONE); 
         } 

         @Override 
         public void onLoadingComplete(String imageUri, 
           View view, Bitmap loadedImage) { 
          // spinner.setVisibility(View.GONE); 
         } 
        }); 

      ((ViewPager) view).addView(imageLayout, 0); 
      return imageLayout; 
     } 

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

     @Override 
     public void restoreState(Parcelable state, ClassLoader loader) { 
     } 

     @Override 
     public Parcelable saveState() { 
      return null; 
     } 

     @Override 
     public void startUpdate(View container) { 
     } 

    } 
} 

[введите описание изображения здесь] [1] изображения: enter image description here

благодаря

+3

Почему кто-то делает downvote? –

ответ

1
imageView.setSingleTapListener(new OnImageViewTouchSingleTapListener() { 
        @Override 
        public void onSingleTapConfirmed() { 
         Log.d("TAG", "setSingleTapListener"); 

         sCounter++; 
         if (sCounter % 2 == 0) { 
          mRlTopOverlayBar.setVisibility(View.GONE); 
          mRlBottomOverlayBar.setVisibility(View.GONE); 
          pager.requestFocus(); 
         } else { 
          mRlTopOverlayBar.setVisibility(View.VISIBLE); 
          mRlBottomOverlayBar.setVisibility(View.VISIBLE); 
          mRlTopOverlayBar.requestFocus(); 
          mRlBottomOverlayBar.requestFocus(); 
          mRlBottomOverlayBar.setClickable(true); 
          mRlTopOverlayBar.setClickable(true); 
         } 
        } 
       }); 
203

Лучший способ установить верхнюю и нижнюю раму, чтобы быть интерактивными, с:

android:clickable="true" 

Выполнение этого гарантирует, что сам вид/кадр будет захватывать все события щелчка и не будет пропускать его через представление позади него. Обратите внимание, что этот метод работает для всех макетов/представлений/элементов управления, но многие элементы управления (например, кнопки) уже имеют эту функцию по умолчанию.

+2

Это правильный ответ. это и «путь android», и он также работает. – programmer

+1

Простой и правильный – Liuting

+2

Это работает, только если нижний вид не является кнопкой. В противном случае кнопка все еще набирает событие клика. – yongsunCN

5

@ gordon1hd1 ответа является правильным, но для тех, кто до сих пор путает, я добавляю свой макет, который содержит FrameLayout как родитель и LinearLayout и два ImageViews как Чайлдс.

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content">   
    <LinearLayout 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:id="@+id/scroll_parent" 
      android:orientation="horizontal" /> 
    <ImageView 
     android:id="@+id/ivArrowLeft" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_marginLeft="4dp" 
     android:src="@drawable/actionbar_back" 
     android:layout_gravity="left|center_vertical" 
     android:background="#3f808080" 
     android:clickable="true" 
     /> 
    <ImageView 
     android:id="@+id/ivArrowRight" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_marginRight="4dp" 
     android:src="@drawable/actionbar_back" 
     android:layout_gravity="right|center_vertical" 
     android:background="#3f808080" 
     android:rotation="180" 
     android:clickable="true" 
     /> 
</FrameLayout> 

Ранее Linearlayout также перехватывать события прикосновения, когда любой из ImageViews прессовали. Добавление android:clickable="true" к ImageViews разрешило проблему.

Если вы столкнулись с этим типом проблемы, добавьте android:clickable="true" к виду, которое вы хотите уловить событие щелчка.

11

android:clickable="true" для верхней и нижней бары.

или дать каждому FrameLayoutonClickListener.

0
<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout android:id="@+id/llSettings" 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_gravity="right" 
    android:background="#ff106279" 
    android:minHeight="25px" 
    android:minWidth="25px" 
    android:onClick="click" 
    android:orientation="vertical" 
    android:visibility="visible"> 

    <LinearLayout 
     android:id="@+id/llSettings1" 
     android:layout_width="200dp" 
     android:layout_height="match_parent" 
     android:layout_gravity="right" 
     android:background="#ff000f" 
     android:clickable="true" 
     android:minHeight="25px" 
     android:minWidth="25px" 
     android:orientation="vertical" 
     android:visibility="visible"> 

     <Button 
      android:id="@+id/button" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_gravity="center_horizontal" 
      android:onClick="buttonclick" 
      android:text="New Button" /> 
    </LinearLayout> 
</RelativeLayout> 

и

public void click(View v) { 
    Toast.makeText(this, "((RelativeLayout)v).toString()", Toast.LENGTH_SHORT).show(); 
} 

public void buttonclick(View v) { 
    Toast.makeText(this, "Button", Toast.LENGTH_SHORT).show(); 
} 
0

Просто Set андроид: кликабельны = "истина" в XML на ваш взгляд, на первом плане.