簡體   English   中英

無法從視圖類型靜態引用非靜態方法setOnTouchListener(View.OnTouchListener)

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

場景:

我創建了一個應用程序抽屜,並在其中放置了一個搜索欄。 這個應用程序抽屜由app_drawer.xml組成,而我下面的片段由main_activity.xml組成。 我遇到的問題是 ,盡管搜索欄顯示得很完美,並且應用程序抽屜可以按原樣拉入和拉出,但是當我拖動它時,什么也沒發生(這是指textview沒有更新)。 即使應該。

有人告訴我以下是修復程序,但我不斷收到錯誤消息:

無法從視圖類型靜態引用非靜態方法setOnTouchListener(View.OnTouchListener)

如何擺脫錯誤?

使用建議的代碼修復:

     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;

    }

}

setOntouchListener是一個接口。

你有

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

應該

sk.setOnTouchListener(new WorkarroundFixMovementOnDrawer());

因為你有

class WorkarroundFixMovementOnDrawer implements View.OnTouchListener 

您的WorkarroundFixMovementOnDrawer實現了View.OnTouchListener接口。

更改

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

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

並向您的班級添加一個對象

public class MainActivity extends Fragment {
TextView textProgress;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM