我刚刚有一个带有按钮的基本标题屏幕,但是当我点击按钮时没有任何反应。屏幕显示正确,但按钮没有响应 - 我已经在调试中尝试了但没有...没有错误,没有信息消息,zilch(我正在使用AVD)。
这是我的代码......
清单:
<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>
XML文件:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".TitleScreen" >
<ImageView
android:src="@drawable/spyeyelogo"
android:contentDescription="@string/logo"
android:layout_centerHorizontal="true"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/logo" />
<Button
android:id="@+id/newBtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/logo"
android:layout_centerHorizontal="true"
android:layout_marginTop="50dp"
android:onClick="newGame"
android:text="@string/newTxt" />
Java文件:
public class TitleScreen extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_title_screen);
}
public void newGame (View v) {
// create intent to start another activity
Intent newGameIntent = new Intent(this, createNewGameActivity.class);
startActivity(newGameIntent);
}
}
这和我的其他应用程序之间唯一的主要区别是我现在尝试使用单个样式文件,并且我重新设计了自己的按钮:
<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>
有人看到我必须犯下的明显错误吗?
答案 0 :(得分:2)
就个人而言,我真的不是那种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);
}
}
如果您正在处理多个Buttons
,则可以使用OnClickListener
处理这些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;
}
}
};
:
View
您获得了调用Buttons
的ID,并使用开关来区分特定的Activity
。例如,在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
代替CreateNewGameActivity
,Fragments
应该被称为Activities
。Fragments
。 Activities
的黄金时代结束了。自Fragments
引入Button
以来,Activity
只是Fragment
的容器。因此,即使您的布局中只有一个Fragment
,也应该有一个空的android:onClick
,其中只包含一个View
,并且在Fragment
中您实现了您的UI和逻辑。 / LI>
Activity
。代码中没有任何迹象表明将调用此方法。并且布局没有理由假设这样的方法存在于加载布局的OnClickListener
,Button
或android:onClick
中的任何位置。除此之外,它甚至不那么方便。在您需要设置{{1}}的所有情况中,99.9%您还需要使用{{1}}执行其他操作,然后您还需要参考。 {{1}}只会使您的代码混乱并使其更加混乱。它将实现细节传播出去,并将其模糊给开发人员。布局知道甚至定义具体的实现细节本身已经非常糟糕了。