Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在包含BaseActivity XML中的ImageView后,未调用Android中的onTouchListener()_Java_Android_Xml_Inheritance_Ontouchlistener - Fatal编程技术网

Java 在包含BaseActivity XML中的ImageView后,未调用Android中的onTouchListener()

Java 在包含BaseActivity XML中的ImageView后,未调用Android中的onTouchListener(),java,android,xml,inheritance,ontouchlistener,Java,Android,Xml,Inheritance,Ontouchlistener,下面的代码显示了一个抽象活动(AppActivity),其他活动必须从中扩展。已经定义了布局,但只继承了一个圆形按钮(扩展ImageView) MainActivity定义了自己的布局,其中必须包含前面提到的按钮。查看我当前的结果,按钮成功继承并显示,不能为空 尽管如此,从“MainActivity”透视图中永远不会调用附加到此ImageView的onTouchListener()。请注意,如果MotionEvent.ACTION\u向下和向上发生,则返回true。所以这不可能是原因。有什么建议

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

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

尽管如此,从“MainActivity”透视图中永远不会调用附加到此ImageView的onTouchListener()。请注意,如果MotionEvent.ACTION\u向下和向上发生,则返回true。所以这不可能是原因。有什么建议吗

带有圆圈按钮(扩展ImageView)的抽象活动,包括onTouchListener()

从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);
        }
<RelativeLayout .../>

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

</RelativeLayout>
    <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>
activity\u main.xml(用于MainActivity)


voice\u btn\u layout.xml(用于AppActivity)


您正在
R.layout.voice\u btn\u layout
中为
圆圈按钮设置
OnTouchListener

MainActivity
中调用
setContentView()
时,将布局
R.layout.voice\u btn\u layout
替换为
eu.alfred.batterywarnerapp.R.layout.activity\u main
。因此,不会调用
AppActivity
circleButton
onTouch()
方法,因为屏幕上显示的
circleButton
AppActivity
中的
circleButton
不同

您可以通过在
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
AppActivity
中的按钮不同

确定要“替换”布局吗?我只是把它包括在内。activity_main.xml是一种特殊的按钮布局,除了它现在被另一个按钮包装外RelativeLayout@GaryKlasen是的,我很确定
R.layout.voice\u btn\u layout
已被
activity\u main.xml
取代
setContentView()
只是膨胀一个新的布局,并将其设置为此
活动的布局。是的,您确实在
AppActivity
onCreate()
中添加了侦听器,但是当您在
MainActivity
onCreate()中再次调用
setContentView()
时,一个新的
eu.alfred.batterywarnerapp.R.layout.activity\u main
布局包含一个新的
R.layout.voice\u btn\u布局
被膨胀并替换了以前的
R.layout.voice\u btn\u布局
。那么我如何在不覆盖引用的情况下包含它呢?@GaryKlasen,不调用
setContentView()
MainActivity
onCreate()
中,尽管我怀疑这是您试图实现的目标。如果您想对
AppActivity
的所有子类调用
setOnTouchListener()
,我建议您将设置的侦听器代码放在
AppActivity
中一个单独的方法中(例如
setupCircleButton()
),并在
MainActivity
onCreate()中调用
super.setupCircleButton()
setContentView()之后。
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) {
        ...