2

Falks,这将是一个愚蠢的错误,但我真的猜不出它在哪里。我正在尝试设置 OnTouchListener 但未调用方法 onTouch。

这是我的代码:

    public class StepActivity extends SherlockActivity  
    {
    private Recipe recipe = null;
    private String TAG = "StepActivity";
    private ArrayList<Step> steps;
    private int caret = 0;
    private int currentStep = 1;
    private int stepQuantity;
    private TextView viewStepBody;
    private TextView stepNumber;
    private ImageView viewPicture;
    private String bodyText;
    private String picture;
    private String [] pictures = new String [5];



    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.step_page);
        RelativeLayout view = new RelativeLayout(this);
        view.setOnTouchListener(new OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent motion) {

                Log.i(TAG, "In onTouch");
                float downXValue = 0;
                // Get the action that was done on this touch event
                switch (motion.getAction())
                {

                    case MotionEvent.ACTION_DOWN:
                    {
                        Log.i(TAG, "In onTouch1");
                        // store the X value when the user's finger was pressed down
                        downXValue = motion.getX();
                        break;
                    }

                    case MotionEvent.ACTION_UP:
                    {
                        Log.i(TAG, "In onTouch2");
                        // Get the X value when the user released his/her finger
                        float currentX = motion.getX();            
                        // going backwards: pushing stuff to the right
                        if (downXValue < currentX)
                        {
                            Log.i(TAG, "In onTouch previous");
                            goPrevious();
                        }

                        // going forwards: pushing stuff to the left
                        if (downXValue > currentX)
                        {
                            Log.i(TAG, "In onTouch next");
                            goNext();
                        }
                        break;
                    }
                }
                // if you return false, these actions will not be recorded
                return true;
            }

        });

        viewStepBody = (TextView)findViewById(R.id.step_body);
        stepNumber = (TextView)findViewById(R.id.step_number);
        viewPicture = (ImageView)findViewById(R.id.picture);


        TextView recipeTitle = (TextView)findViewById(R.id.recipe_title);
        try {
            getSupportActionBar().setDisplayShowTitleEnabled(false);
            recipe = (Recipe)getIntent().getSerializableExtra("Recipe1");
            steps = recipe.getSteps();
            stepQuantity = steps.size();

            Log.d(TAG,"steps: " + steps.size());
            if (stepQuantity > 0) {
                Step step = steps.get(0);
                pictures[0] = Constants.URL + step.getImg_url();
                bodyText =  step.getInstruction();
                new DownloadImageTask().execute(pictures);
                recipeTitle.setText(recipe.getTitle());
            }
            updateInfo();
        } catch (Exception e) {
            Toast.makeText(this, "Error occured" + e.getMessage(), 200);
        }

    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        com.actionbarsherlock.view.MenuInflater inflater = getSupportMenuInflater();
        inflater.inflate(R.menu.step_menu, (com.actionbarsherlock.view.Menu) menu);
        return super.onCreateOptionsMenu(menu);
    }

    private void updateInfo() {
        new DownloadImageTask().execute(pictures);
        viewStepBody.setText(bodyText);
        stepNumber.setText(currentStep + "/" + stepQuantity);
    }

    private void goNext() {
        if (currentStep != stepQuantity) {
            caret++;
            currentStep++;
            Step newStep = steps.get(caret);
            pictures[0] = Constants.URL + newStep.getImg_url();
            bodyText = newStep.getInstruction();
            updateInfo();
        } else {
            caret = 0;
            currentStep = 1;
            Step newStep = steps.get(caret);
            bodyText = newStep.getInstruction();
            pictures[0] = Constants.URL + newStep.getImg_url();
            updateInfo();
        }
    }

    private void goPrevious() {
        if (currentStep != 1) {
            caret--;
            currentStep--;
            Step newStep = steps.get(caret);
            bodyText = newStep.getInstruction();
            pictures[0] = Constants.URL + newStep.getImg_url();
            updateInfo();
        }
        else {
            caret = stepQuantity - 1;
            currentStep = stepQuantity;
            Step newStep = steps.get(caret);
            bodyText = newStep.getInstruction();
            pictures[0] = Constants.URL + newStep.getImg_url();
            updateInfo();
        }
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch(item.getItemId())  {
        case R.id.next: 
            goNext();
            return true;
        case R.id.previous: 
            goPrevious();
            return true;
        default:
            return super.onOptionsItemSelected(item);
        }
    }

这是传递给 setContentView() 方法的 step_page.xml。

    <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" 
    android:id="@+id/step_layout1">
<ScrollView
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <RelativeLayout 
        android:layout_width="match_parent"
        android:layout_height="match_parent" >

        <TextView android:id="@+id/recipe_title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="23dp"
            android:layout_alignParentRight="true"
            android:layout_alignParentTop="true"
            android:textColor="#9d9d9d"
            android:textStyle="bold"
            android:layout_marginTop="4dp"/>

        <TextView android:id="@+id/step_word"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="25dp"
            android:layout_below="@+id/recipe_title"
            android:textColor="#000000"
            android:textStyle="bold"
            android:text="@string/step_word"
            android:layout_marginTop="4dp"/>

        <TextView android:id="@+id/step_number"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="25dp"
            android:layout_toRightOf="@+id/step_word"
            android:layout_below="@+id/recipe_title"
            android:textColor="#000000"
            android:textStyle="bold"
            android:layout_marginLeft="3dp"
            android:text="1/12"
            android:layout_marginTop="4dp"/>



        <ImageView
            android:id="@+id/picture"
            android:layout_width="300dp"
            android:layout_height="200dp"
            android:layout_below="@+id/step_word"
            android:layout_centerHorizontal="true"
            />

        <TextView android:id="@+id/step_body"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="22dp"
            android:textColor="#000000"
            android:paddingTop="2dp"
            android:layout_below="@+id/picture"
            /> 

    </RelativeLayout>
</ScrollView>
</RelativeLayout>

这里建议的另一种方法不起作用。:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.step_page);
    RelativeLayout view = (RelativeLayout) findViewById(R.id.step_layout1);
    view.setOnTouchListener(new OnTouchListener() {
        @Override
        public boolean onTouch(View view, MotionEvent motion) {

            Log.i(TAG, "In onTouch");
            float downXValue = 0;
            // Get the action that was done on this touch event
            switch (motion.getAction())
            {

                case MotionEvent.ACTION_DOWN:
                {
                    Log.i(TAG, "In onTouch1");
                    // store the X value when the user's finger was pressed down
                    downXValue = motion.getX();
                    break;
                }

                case MotionEvent.ACTION_UP:
                {
                    Log.i(TAG, "In onTouch2");
                    // Get the X value when the user released his/her finger
                    float currentX = motion.getX();            
                    // going backwards: pushing stuff to the right
                    if (downXValue < currentX)
                    {
                        Log.i(TAG, "In onTouch previous");
                        goPrevious();
                    }

                    // going forwards: pushing stuff to the left
                    if (downXValue > currentX)
                    {
                        Log.i(TAG, "In onTouch next");
                        goNext();
                    }
                    break;
                }
            }
            // if you return false, these actions will not be recorded
            return true;
        }

    });

有什么意见吗?

4

1 回答 1

1

与我认为您的想法相反RelativeLayout view = new RelativeLayout(this);,它不会为您的活动布局提供父 RelativeLayout 视图。您可以做的是为您的父 RelativeLayout 分配一个 id,使用 findViewById 获取它,然后将您的 onTouchListener 或其他任何东西附加到它上面。

编辑(因为您发布了 xml 布局)

您的父 RelativeLayout 没有暴露 - 整个屏幕都被 ScrollView 占据,因此它后面的 RelativeLayout 永远无法触摸。由于您的内部 RelativeLayout(ScrollView 中的那个)没有任何可点击的视图,因此您可以在其上附加 onTouch。

于 2012-05-23T11:06:48.887 回答