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