Android中的onTouchListener()在包含来自BaseActivity-XML的ImageView之后未被调用

时间:2016-02-04 16:00:19

标签: java android xml inheritance ontouchlistener

以下代码显示了一个抽象活动(AppActivity),其他活动必须从中扩展。已经定义了一个布局,但只继承了一个圆形按钮(扩展ImageView)。

MainActivity定义了一个自己的布局,其中必须包含前面提到的按钮。查看我当前的结果,Button成功继承并显示,不能为null

然而,附加到此ImageView的onTouchListener()永远不会从透视“MainActivity”调用。注意,如果发生MotionEvent.ACTION_DOWN和UP,我返回true。所以这不能成为原因。有什么建议吗?

包含onTouchListener()的CircleButton(扩展ImageView)的抽象活动

public abstract class AppActivity extends Activity {

    public CircleButton circleButton;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.voice_btn_layout);

        circleButton = (CircleButton) findViewById(R.id.voiceControlBtn);

        circleButton.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                Log.i("TOUCH", "");
                if (event.getAction() == MotionEvent.ACTION_DOWN) {
                    ButtonGotPressed();
                    return true;
                } else if (event.getAction() == MotionEvent.ACTION_UP) {
                    circleButton.ButtonGotReleased();
                    return true;
                }
                return false;
            }
        });
}

从AppActivity扩展的活动

  public class MainActivity extends AppActivity implements ICadeCommand {

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(eu.alfred.batterywarnerapp.R.layout.activity_main);
        }

activity_main.xml(适用于MainActivity)

<RelativeLayout .../>

    <include layout="@layout/voice_btn_layout" />

</RelativeLayout>

voice_btn_layout.xml(适用于AppActivity)

    <FrameLayout
            xmlns:android="http://schemas.android.com/apk/res/android"
            xmlns:app="http://schemas.android.com/apk/res-auto"
            android:layout_width="80dip"
            android:layout_height="80dip"
            android:layout_margin="15dip"
            android:layout_alignParentEnd="true"
            android:layout_alignParentBottom="true">

            <packagename.CircleButton
                ...
                android:scaleType="fitXY"/>

    </FrameLayout>

1 个答案:

答案 0 :(得分:0)

您在- (IBAction)flagTapped:(id)sender { _tableView = [[FeedTableViewController alloc] init]; [_tableView presentAlert]; } 中为OnTouchListener设置了circleButton

当您在R.layout.voice_btn_layout中致电setContentView()时,您将布局MainActivity替换为R.layout.voice_btn_layout。因此,eu.alfred.batterywarnerapp.R.layout.activity_mainonTouch()的{​​{1}}方法未被调用,因为屏幕上显示的circleButtonAppActivity中的circleButton不同}。

您可以通过在circleButton

中添加额外的行来测试是否确实如此
AppActivity

您应该注意到AppActivity仍然可见,因此显示屏幕上显示的public abstract class AppActivity extends Activity { public CircleButton circleButton; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.voice_btn_layout); circleButton = (CircleButton) findViewById(R.id.voiceControlBtn); circleButton.setVisibility(View.GONE); // ADD THIS LINE circleButton.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { ... circleButton中显示的circleButton不同。