2014-03-12 4 views
0

시나리오 : 나는 앱 서랍을 만들고 그 안에 SeekBar를 배치 한은 View 형에서 비 정적 메소드 setOnTouchListener (View.OnTouchListener)에 대한 정적 참조를 만들 수 없습니다

. 이 응용 프로그램 서랍은 app_drawer.xml에서 만들어지며 아래의 내 조각은 main_activity.xml에서 만들어집니다. 내가 찾던 문제는입니다.하지만 검색 표시 줄이 완벽하게 나타나고 앱 서랍을 끌어 당기거나 끌 때 아무 것도 일어나지 않습니다 (텍스트 뷰가 업데이트되지 않음). 비록 그것이해야한다.

나는 아래 말했다 수정,하지만 난 오류가 계속 봤는데 : 내가 오류를 제거하려면 어떻게

Cannot make a static reference to the non-static method setOnTouchListener(View.OnTouchListener) from the type View

를?

수정하여 제안 된 코드 :

 public class MainActivity extends Fragment { 

      @Override 
      public View onCreateView(LayoutInflater inflater, ViewGroup container, 
        Bundle savedInstanceState) { 

       View rootView = inflater.inflate(R.layout.main_activity, container, false); 
       View rootView2 = inflater.inflate(R.layout.app_drawer, container, false); 



     final SeekBar sk=(SeekBar) rootView2.findViewById(R.id.seekBar1); 
     SeekBar.setOnTouchListener(new WorkarroundFixMovementOnDrawer()); 

     TextView textProgress = (TextView)rootView.findViewById(R.id.TextView01); 

       sk.setOnSeekBarChangeListener(new OnSeekBarChangeListener() { 

       public void onProgressChanged(SeekBar bar, int progress, 
        boolean fromUser) { 

textProgress.setText("Progress: "+ String.valueOf(progress)); 
    } 
      @Override 
      public void onStartTrackingTouch(SeekBar seekBar) { 
       // TODO Auto-generated method stub 

      } 

      @Override 
      public void onStopTrackingTouch(SeekBar seekBar) { 
       // TODO Auto-generated method stub 

      } 
       }); 

       return rootView; 
      } 
     } 

    /** 
    * This is just a workarround for make seekbar work on drawer 
    */ 
    static class WorkarroundFixMovementOnDrawer implements View.OnTouchListener { 

     @Override 
     public boolean onTouch(View v, MotionEvent event) { 

      int action = event.getAction(); 
      DrawerLayout parentDrawer = getParentDrawer(v); 

      switch (action) { 
       case MotionEvent.ACTION_DOWN: 
        // Disallow Drawer to intercept touch events. 
        if (parentDrawer != null) { 
         parentDrawer.requestDisallowInterceptTouchEvent(true); 
        } 
        break; 

       case MotionEvent.ACTION_UP: 
        // Allow Drawer to intercept touch events. 
        if (parentDrawer != null) { 
         parentDrawer.requestDisallowInterceptTouchEvent(false); 
        } 
        break; 
      } 

      // Handle seekbar touch events. 
      v.onTouchEvent(event); 
      return true; 

     } 

     /** 
     * Try to get DrawerLayout from parent 
     * @param view view to search 
     * @return the drawerLayout parent 
     */ 
     public static DrawerLayout getParentDrawer(View view) { 

      if (view != null) { 

       ViewParent recursiveView = view.getParent(); 
       while (!(recursiveView instanceof DrawerLayout)) { 

        if (recursiveView == null) { 
         return null; 
        } 

        recursiveView = recursiveView.getParent(); 
       } 

       return (DrawerLayout) recursiveView; 

      } 

      return null; 

     } 

    } 

는 오리지널 코드 :

 public class MainActivity extends Fragment { 

      @Override 
      public View onCreateView(LayoutInflater inflater, ViewGroup container, 
        Bundle savedInstanceState) { 

       View rootView = inflater.inflate(R.layout.main_activity, container, false); 
       View rootView2 = inflater.inflate(R.layout.app_drawer, container, false); 



     final SeekBar sk=(SeekBar) rootView2.findViewById(R.id.seekBar1); 
     TextView textProgress = (TextView)rootView.findViewById(R.id.TextView01); 

       sk.setOnSeekBarChangeListener(new OnSeekBarChangeListener() { 

       public void onProgressChanged(SeekBar bar, int progress, 
        boolean fromUser) { 

textProgress.setText("Progress: "+ String.valueOf(progress)); 
    } 
      @Override 
      public void onStartTrackingTouch(SeekBar seekBar) { 
       // TODO Auto-generated method stub 

      } 

      @Override 
      public void onStopTrackingTouch(SeekBar seekBar) { 
       // TODO Auto-generated method stub 

      } 
       }); 

       return rootView; 
      } 
     } 

제안 수정 :

seekBar.setOnTouchListener(new WorkarroundFixMovementOnDrawer()); 


/** 
* This is just a workarround for make seekbar work on drawer 
*/ 
static class WorkarroundFixMovementOnDrawer implements View.OnTouchListener { 

    @Override 
    public boolean onTouch(View v, MotionEvent event) { 

     int action = event.getAction(); 
     DrawerLayout parentDrawer = getParentDrawer(v); 

     switch (action) { 
      case MotionEvent.ACTION_DOWN: 
       // Disallow Drawer to intercept touch events. 
       if (parentDrawer != null) { 
        parentDrawer.requestDisallowInterceptTouchEvent(true); 
       } 
       break; 

      case MotionEvent.ACTION_UP: 
       // Allow Drawer to intercept touch events. 
       if (parentDrawer != null) { 
        parentDrawer.requestDisallowInterceptTouchEvent(false); 
       } 
       break; 
     } 

     // Handle seekbar touch events. 
     v.onTouchEvent(event); 
     return true; 

    } 

    /** 
    * Try to get DrawerLayout from parent 
    * @param view view to search 
    * @return the drawerLayout parent 
    */ 
    public static DrawerLayout getParentDrawer(View view) { 

     if (view != null) { 

      ViewParent recursiveView = view.getParent(); 
      while (!(recursiveView instanceof DrawerLayout)) { 

       if (recursiveView == null) { 
        return null; 
       } 

       recursiveView = recursiveView.getParent(); 
      } 

      return (DrawerLayout) recursiveView; 

     } 

     return null; 

    } 

} 

답변

0

setOntouchListener은 인터페이스입니다.

당신은 당신이 WorkarroundFixMovementOnDrawer 인터페이스 View.OnTouchListener를 구현 귀하의

class WorkarroundFixMovementOnDrawer implements View.OnTouchListener 

이 Coz 볼

final SeekBar sk=(SeekBar) rootView2.findViewById(R.id.seekBar1); 
SeekBar.setOnTouchListener(new WorkarroundFixMovementOnDrawer()); 

sk.setOnTouchListener(new WorkarroundFixMovementOnDrawer()); 

을 할 수 있어야합니다.

0

변경

TextView textProgress = (TextView)rootView.findViewById(R.id.TextView01); 

클래스

public class MainActivity extends Fragment { 
TextView textProgress; 
+0

textProgress = (TextView)rootView.findViewById(R.id.TextView01); 

와 개체를 추가하면 원래의 코드에 이것을 추가합니다. 문제는 런타임에 참조 textProgress를 만들지 만 만들 수는 없지만 인터페이스에서도 사용한다는 것입니다. 참조에 액세스 할 때 최소한 널 포인터를 가져 오는 것을 의미하는 객체가 필요하거나 런타임 전에 작성되도록 정적으로 선언해야합니다. –