Android按钮/应用程序不工作
我一定在做一些非常愚蠢的事情。这是我的第二个应用程序-第一个运行良好(诚实) 我刚刚有一个基本的标题屏幕,上面有一个按钮,但当我点击按钮时什么也没发生。屏幕显示正确,但按钮没有响应-我在调试中尝试过,但没有结果…没有错误,没有信息消息,Zillch(我正在使用AVD) 这是我的密码 舱单:Android按钮/应用程序不工作,android,xml,button,Android,Xml,Button,我一定在做一些非常愚蠢的事情。这是我的第二个应用程序-第一个运行良好(诚实) 我刚刚有一个基本的标题屏幕,上面有一个按钮,但当我点击按钮时什么也没发生。屏幕显示正确,但按钮没有响应-我在调试中尝试过,但没有结果…没有错误,没有信息消息,Zillch(我正在使用AVD) 这是我的密码 舱单: <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.spyeye" and
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.spyeye"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="11"
android:targetSdkVersion="17" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/spyEyeTheme" >
<activity
android:name="com.example.spyeye.TitleScreen"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name="com.example.spyeye.createNewGameActivity"
android:label="@string/app_name"
android:parentActivityName="com.example.spyeye.TitleScreen" >
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="com.example.spyeye.TitleScreen" />
</activity>
该应用程序与我的其他应用程序之间唯一的主要区别在于,我现在尝试使用单一样式的文件,并重新设计了自己的按钮:
<style name="spyEyeTheme" parent="android:Theme.Light">
<item name="android:buttonStyle">@style/myButton</item>
</style>
<style name="myButton" parent="android:Theme.Light">
<item name="android:background">#008080</item>
<item name="android:textColor">#FFFFFF</item>
<item name="android:textSize">24sp</item>
<item name="android:typeface">sans</item>
<item name="android:padding">10sp</item>
</style>
@样式/我的按钮
#008080
#FFFFFF
24便士
桑
10便士
有人看到我犯的明显错误了吗?就我个人而言,我真的不是那种
android:onClick=“newGame”
东西的忠实粉丝。你应该用传统的方式来尝试,比如:
public class TitleScreen extends Activity {
private Button newBtn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_title_screen);
this.newBtn = (Button) findViewById(R.id.newBtn);
this.newBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent newGameIntent = new Intent(this, createNewGameActivity.class);
startActivity(newGameIntent);
}
});
}
}
public class TitleScreen extends Activity implements View.OnClickListener {
private Button newBtn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_title_screen);
this.newBtn = (Button) findViewById(R.id.newBtn);
this.newBtn.setOnClickListener(this);
}
@Override
public void onClick(View v) {
Intent newGameIntent = new Intent(this, createNewGameActivity.class);
startActivity(newGameIntent);
}
}
private final View.OnClickListener clickListener = new View.OnClickListener() {
@Override
public void onClick(View view) {
final int id = view.getId();
switch (id) {
case R.id.newBtn:
Intent newGameIntent = new Intent(this, createNewGameActivity.class);
startActivity(newGameIntent);
break;
case R.id.otherButton:
Toast.makeText(this, "Other Button clicked!", Toast.LENGTH_SHORT).show();
break;
case R.id.cancelButton:
...
break;
}
}
};
public class TitleScreen extends Activity implements View.OnClickListener {
private Button newBtn;
private Button otherBtn;
private Button cancelBtn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_title_screen);
this.newBtn = (Button) findViewById(R.id.newBtn);
this.newBtn.setOnClickListener(this);
this.otherBtn = (Button) findViewById(R.id.otherBtn);
this.otherBtn.setOnClickListener(this);
this.cancelBtn = (Button) findViewById(R.id.cancelBtn);
this.cancelBtn.setOnClickListener(this);
}
@Override
public void onClick(View v) {
final int id = view.getId();
switch (id) {
case R.id.newBtn:
Intent newGameIntent = new Intent(this, createNewGameActivity.class);
startActivity(newGameIntent);
break;
case R.id.otherBtn:
Toast.makeText(this, "Other Button clicked!", Toast.LENGTH_SHORT).show();
break;
case R.id.cancelBtn:
...
break;
}
}
}
或者像这样:
public class TitleScreen extends Activity {
private Button newBtn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_title_screen);
this.newBtn = (Button) findViewById(R.id.newBtn);
this.newBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent newGameIntent = new Intent(this, createNewGameActivity.class);
startActivity(newGameIntent);
}
});
}
}
public class TitleScreen extends Activity implements View.OnClickListener {
private Button newBtn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_title_screen);
this.newBtn = (Button) findViewById(R.id.newBtn);
this.newBtn.setOnClickListener(this);
}
@Override
public void onClick(View v) {
Intent newGameIntent = new Intent(this, createNewGameActivity.class);
startActivity(newGameIntent);
}
}
private final View.OnClickListener clickListener = new View.OnClickListener() {
@Override
public void onClick(View view) {
final int id = view.getId();
switch (id) {
case R.id.newBtn:
Intent newGameIntent = new Intent(this, createNewGameActivity.class);
startActivity(newGameIntent);
break;
case R.id.otherButton:
Toast.makeText(this, "Other Button clicked!", Toast.LENGTH_SHORT).show();
break;
case R.id.cancelButton:
...
break;
}
}
};
public class TitleScreen extends Activity implements View.OnClickListener {
private Button newBtn;
private Button otherBtn;
private Button cancelBtn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_title_screen);
this.newBtn = (Button) findViewById(R.id.newBtn);
this.newBtn.setOnClickListener(this);
this.otherBtn = (Button) findViewById(R.id.otherBtn);
this.otherBtn.setOnClickListener(this);
this.cancelBtn = (Button) findViewById(R.id.cancelBtn);
this.cancelBtn.setOnClickListener(this);
}
@Override
public void onClick(View v) {
final int id = view.getId();
switch (id) {
case R.id.newBtn:
Intent newGameIntent = new Intent(this, createNewGameActivity.class);
startActivity(newGameIntent);
break;
case R.id.otherBtn:
Toast.makeText(this, "Other Button clicked!", Toast.LENGTH_SHORT).show();
break;
case R.id.cancelBtn:
...
break;
}
}
}
如果您正在处理多个
按钮
,您可以在一个OnClickListener
中处理它们,如下所示:
public class TitleScreen extends Activity {
private Button newBtn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_title_screen);
this.newBtn = (Button) findViewById(R.id.newBtn);
this.newBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent newGameIntent = new Intent(this, createNewGameActivity.class);
startActivity(newGameIntent);
}
});
}
}
public class TitleScreen extends Activity implements View.OnClickListener {
private Button newBtn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_title_screen);
this.newBtn = (Button) findViewById(R.id.newBtn);
this.newBtn.setOnClickListener(this);
}
@Override
public void onClick(View v) {
Intent newGameIntent = new Intent(this, createNewGameActivity.class);
startActivity(newGameIntent);
}
}
private final View.OnClickListener clickListener = new View.OnClickListener() {
@Override
public void onClick(View view) {
final int id = view.getId();
switch (id) {
case R.id.newBtn:
Intent newGameIntent = new Intent(this, createNewGameActivity.class);
startActivity(newGameIntent);
break;
case R.id.otherButton:
Toast.makeText(this, "Other Button clicked!", Toast.LENGTH_SHORT).show();
break;
case R.id.cancelButton:
...
break;
}
}
};
public class TitleScreen extends Activity implements View.OnClickListener {
private Button newBtn;
private Button otherBtn;
private Button cancelBtn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_title_screen);
this.newBtn = (Button) findViewById(R.id.newBtn);
this.newBtn.setOnClickListener(this);
this.otherBtn = (Button) findViewById(R.id.otherBtn);
this.otherBtn.setOnClickListener(this);
this.cancelBtn = (Button) findViewById(R.id.cancelBtn);
this.cancelBtn.setOnClickListener(this);
}
@Override
public void onClick(View v) {
final int id = view.getId();
switch (id) {
case R.id.newBtn:
Intent newGameIntent = new Intent(this, createNewGameActivity.class);
startActivity(newGameIntent);
break;
case R.id.otherBtn:
Toast.makeText(this, "Other Button clicked!", Toast.LENGTH_SHORT).show();
break;
case R.id.cancelBtn:
...
break;
}
}
}
您可以获得调用的视图的id
,并使用开关区分特定的按钮。例如,在您的活动中
可以这样实现:
public class TitleScreen extends Activity {
private Button newBtn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_title_screen);
this.newBtn = (Button) findViewById(R.id.newBtn);
this.newBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent newGameIntent = new Intent(this, createNewGameActivity.class);
startActivity(newGameIntent);
}
});
}
}
public class TitleScreen extends Activity implements View.OnClickListener {
private Button newBtn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_title_screen);
this.newBtn = (Button) findViewById(R.id.newBtn);
this.newBtn.setOnClickListener(this);
}
@Override
public void onClick(View v) {
Intent newGameIntent = new Intent(this, createNewGameActivity.class);
startActivity(newGameIntent);
}
}
private final View.OnClickListener clickListener = new View.OnClickListener() {
@Override
public void onClick(View view) {
final int id = view.getId();
switch (id) {
case R.id.newBtn:
Intent newGameIntent = new Intent(this, createNewGameActivity.class);
startActivity(newGameIntent);
break;
case R.id.otherButton:
Toast.makeText(this, "Other Button clicked!", Toast.LENGTH_SHORT).show();
break;
case R.id.cancelButton:
...
break;
}
}
};
public class TitleScreen extends Activity implements View.OnClickListener {
private Button newBtn;
private Button otherBtn;
private Button cancelBtn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_title_screen);
this.newBtn = (Button) findViewById(R.id.newBtn);
this.newBtn.setOnClickListener(this);
this.otherBtn = (Button) findViewById(R.id.otherBtn);
this.otherBtn.setOnClickListener(this);
this.cancelBtn = (Button) findViewById(R.id.cancelBtn);
this.cancelBtn.setOnClickListener(this);
}
@Override
public void onClick(View v) {
final int id = view.getId();
switch (id) {
case R.id.newBtn:
Intent newGameIntent = new Intent(this, createNewGameActivity.class);
startActivity(newGameIntent);
break;
case R.id.otherBtn:
Toast.makeText(this, "Other Button clicked!", Toast.LENGTH_SHORT).show();
break;
case R.id.cancelBtn:
...
break;
}
}
}
有几件事引起了我的注意:
- 类的名称应该以大写字母开头,因此应该调用
createNewGameActivity
而不是Activity
- 使用
片段
。活动的黄金时代已经结束。由于引入了片段
,活动
应该是片段
的容器。因此,即使在布局中只有一个按钮
,也应该有一个空的活动
,其中只包含一个片段
,在该片段
中实现UI和逻辑
- 不要使用android:onClick
。代码中根本没有表示将调用此方法。布局没有理由假设这样的方法存在于加载布局的视图
、片段
或活动
中的任何位置。除此之外,它甚至没有那么方便。在99.9%需要设置OnClickListener
的情况下,您还需要使用按钮执行其他操作,然后仍然需要引用android:onClick
只会将代码弄乱,使其更加混乱。它将实现细节分散开来,并使开发人员看不清。布局知道甚至定义了具体的实现细节,这本身就已经很糟糕了
我没有看到任何用于按钮或任何用于处理单击的onClickListeners。createNewGameActivity.class的代码在哪里?Derp。没有看到。对于grins,请删除imageview并查看按钮是否点击。@mtorres-我有该代码,但不想混淆东西-onClick似乎不起作用,因此它无法到达目的地…好的,你可能不喜欢它,但我在我的其他应用程序中广泛使用了它,而且很好。TBH,比“旧方法”简单得多:-)当然可以,在我看来它不干净。代码中根本没有表示将调用此方法。布局没有理由假设这样的方法存在于加载布局的视图
、片段
或活动
中的任何位置。这很糟糕,它根本没有存在的理由。你从中得到了什么用呢?在99.9%的情况下,你需要设置一个OnClickListener
,你还需要用按钮做其他事情,然后你无论如何都需要参考。也许你已经习惯了,但对我来说,这是非常笨拙和不直观的。我的另一个应用程序屏幕上有4个按钮——如果我必须这样做,代码看起来会很可怕。但是谢谢你的建议,如果没有人能解释为什么另一种方法不起作用,我会使用这种方法…@Nelmo这只是android:onClick
的另一个缺点。它应该可以工作,没有人知道错误在哪里,或者为什么什么都没有发生。它非常糟糕,并且对开发者隐藏了重要的东西。所有那些点击式的听众真的占用不了那么多空间。但我会在我的问题中编辑一种处理多个按钮点击的方法,非常快速和简单。