2013-03-08 2 views
2

У меня есть два макета, один LinearLayout и один RelativeLayout. В LinearLayout у меня 10 изображений. Когда я нажимаю одно изображение, оно добавляется к RelativeLayout. Подобное событие дается для всех 10 изображений. В RelativeLayout я установил OnTouchListener в ImageView, добавленный из LinearLayout. Но моя проблема заключается в том, что onTouch работает только для недавно добавленного ImageView, но когда я пытаюсь коснуться ранее добавленных изображений, он не работает. Я хочу добавить слушателя для всех изображений, добавленных в относительный макет.Как установить OnTouchListener для динамически созданных просмотров?

Ниже то, что я пытался до сих пор:

for(int i = 0; i < data.length; i++){ 
      image[i] = new ImageView(getApplicationContext()); 
      try{ 
       // int imgID = getResources().getIdentifier(data[i], null, getPackageName()); 
       image[i].setImageResource(data[i]); 

      }catch(Exception e){ 
       int imgID = getResources().getIdentifier("nia", "drawable", "package"); 
       image[i].setImageResource(imgID); 
      }   
      LinearLayout.LayoutParams LEye = new LinearLayout.LayoutParams(
        100 , 70); 
      LEye.leftMargin=20; 
      image[i].setLayoutParams(LEye); 
      shapeImageContainer.addView(image[i]); //shapeImageContainer is the Linear Layout 
      final int c=i; 
      image[i].setOnClickListener(new OnClickListener() { 

       @Override 
       public void onClick(View v) { 
        // TODO Auto-generated method stub 

        //addContentView(addIcon(), new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); 
        Toast.makeText(NewProject.this, "Position "+c, Toast.LENGTH_SHORT).show(); 

        rootView.addView(addIcon(c)); //rootView is the Relative layout 

       } 
      }); 

      //image[i].setOnTouchListener(MyOnTouchListener); 

     } 


private ImageView addIcon(int c){ 
     item = new ImageView(this); 
     item.setImageResource(data[c]); 
     item.setAdjustViewBounds(true); 
     RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(100, 60); 
     if(mIconIdCounter != 1){ 
      params.addRule(RelativeLayout.RIGHT_OF,c-1); 
     } 
     item.setLayoutParams(params); 
     item.setId(mIconIdCounter); 
     ++mIconIdCounter; 
     item.setOnTouchListener(MyOnTouchListener); 
     return item; 
    } 

    OnTouchListener MyOnTouchListener = new OnTouchListener() { 

     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      // TODO Auto-generated method stub 
//   scroll.setEnabled(false); 
//   horizontal.setEnabled(false); 

//   scroll.setVisibility(View.GONE); 
//   horizontal.setVisibility(View.GONE); 
     RelativeLayout.LayoutParams layoutParams2 = (RelativeLayout.LayoutParams) item.getLayoutParams(); 
       switch(event.getActionMasked()) 
       { 

        case MotionEvent.ACTION_MOVE: 
         scroll.requestDisallowInterceptTouchEvent(true); 
         horizontal.requestDisallowInterceptTouchEvent(true); 
         int x_cord = (int) event.getRawX(); 
         int y_cord = (int) event.getRawY(); 

         //right margin 
         if (x_cord > windowwidth) { 
          x_cord = windowwidth-10; 
         } 

         // left margin original 
         if (x_cord <68) { 
          x_cord = 68; 
         } 
         // left margin original 
         if (y_cord <68) { 
          y_cord = 68; 
         } 
         if (y_cord > windowheight) { 
          y_cord = windowheight-10; 
         } 

         // tv.setText(String.valueOf(y_cord)); 
         layoutParams2.leftMargin = x_cord -60; 
         layoutParams2.topMargin = y_cord -65; 
         item.setLayoutParams(layoutParams2); 
         break; 
        default: 
         break; 
       } 
      return true; 
     } 

    }; 
+0

Сообщение макет XML файл –

ответ

2

Но моя проблема в том, onTouch работает только для ImageView, который недавно добавленным, но при попытке прикоснуться к ранее добавленные изображения, это не работает.

Это потому, что в OnTouchListener использовать item поле, чтобы сделать вашу работу (которая всегда будет указывать на последнюю ImageView добавил, как вы написали код) вместо того, чтобы использовать View, для которого называется слушатель. Попробуйте что-то вроде этого:

RelativeLayout.LayoutParams layoutParams2 = (RelativeLayout.LayoutParams) v.getLayoutParams(); 
// rest of the onTouch callback... 
v.setLayoutParams(layoutParams2); 
+0

Спасибо вам much..I действительно сделал такую ​​глупую ошибку. –

Смежные вопросы