实现setOnClickListener

时间:2011-11-21 21:18:23

标签: android

我有这个样本,我正在尝试在子视图中实现点击项目

我有两个xml文件

这是subview.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <TextView
            android:id="@+id/textLabel"
            android:layout_height="fill_parent"
            android:layout_width="fill_parent"
            android:textSize="50dip"
            android:textColor="#00FF00"
            android:textStyle="bold"/>

</LinearLayout>

这是scrollview.xml视图:

<?xml version="1.0" encoding="utf-8"?>
<HorizontalScrollView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/scrollview"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:scrollbars="none">

    <LinearLayout
            android:layout_width="fill_parent"
            android:id="@+id/scrollviewlinearlayout"
            android:layout_height="fill_parent">
    </LinearLayout>
</HorizontalScrollView>

这是活动:

public class TestTwo extends Activity {
Context mContext;
HorizontalScrollView mScrollView;
LinearLayout mLinearLayout;
LinearLayout.LayoutParams mLinearLayoutParams;
Display mDisplay;
// scroll behaviour
private int mScrollStartPosition;
private static final float SCROLL_MARGIN = 0.2f;

@Override
public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mContext = this;
        // load layout from xml and get references to sub-views
        setContentView(R.layout.scrollview);
        mScrollView = (HorizontalScrollView) findViewById(R.id.scrollview);
        mLinearLayout = (LinearLayout) findViewById(R.id.scrollviewlinearlayout);
        // get a display reference (used to find screen size)
        mDisplay = ((WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
        // get the layout parameters to apply to the sub-views
        mLinearLayoutParams = new LayoutParams(mDisplay.getWidth(), mDisplay.getHeight());
        // add some views to the ScrollView
        addViewsToScrollView();

}

private void addViewsToScrollView() {
    LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
    for (int i = 0; i < 3; i++) {
            // inflate view from xml
            View child = inflater.inflate(R.layout.subview, null);
            // give it a number
            final TextView text = (TextView) child.findViewById(R.id.textLabel);
            text.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    text.setText("Test");
                }
            });
            text.setText("" + (i + 1));
            // give it a colour
            text.setBackgroundColor(Color.rgb((int) (Math.random() * 255), (int) (Math.random() * 255),
                            (int) (Math.random() * 255)));
            // apply layout parameters, and add it
            child.setLayoutParams(mLinearLayoutParams);
            mLinearLayout.addView(child);
    }
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
        int viewWidth = mDisplay.getWidth(); // width of each view
        int triggerWidth = (int) (SCROLL_MARGIN * viewWidth); // amount user has to scroll to move to next view
        int pos = mScrollView.getScrollX();
        int diff = pos % viewWidth; // offset of current scroll from leftmost view's snap position
        int posLeftView = pos - diff; // absolute snap position of the leftmost view on screen
        switch (ev.getAction()) {
                case MotionEvent.ACTION_DOWN:
                        // Record the starting scroll position. This is used to decide the scroll direction.
                        mScrollStartPosition = pos;
                        break;
                case MotionEvent.ACTION_UP:
                        if (pos > mScrollStartPosition) {
                                // Scrolling right
                                if (diff > triggerWidth) mScrollView.smoothScrollTo(posLeftView + viewWidth, 0);
                                else mScrollView.smoothScrollTo(posLeftView, 0);
                        } else {
                                // Scrolling left
                                if (diff > (viewWidth - triggerWidth)) mScrollView.smoothScrollTo(posLeftView + viewWidth, 0);
                                else mScrollView.smoothScrollTo(posLeftView, 0);
                        }
                        // replacing our scrollTo command with it's own
                        return true;
        }
        return super.dispatchTouchEvent(ev);
}

}

我试图调试它,似乎它没有触发onClick事件 这个问题可以帮我吗?

2 个答案:

答案 0 :(得分:0)

你正在做一堆疯狂的事情,我将再次离开。在text.setClickable(true)

上试试final TextView text

答案 1 :(得分:0)

很抱歉所有这些编辑。这是你的问题。

  1. 您不应该使用child声明
  2. <强> 2。你不应该为不在当前内容范围内的项目设置onclick监听器

    所以......

        final TextView text = (TextView) child.findViewById(R.id.textLabel);
    

    应该是

        final TextView text = (TextView) findViewById(R.id.textLabel);
    

    因为内容需要设置为正确的xml文件

    setContentView(R.layout.scrollview);
    

    需要

    setContentView(R.layout.<NAME OF SECOND XML FILE WHICH U DIDNT INCLUDE>);