Android按钮/应用无法正常工作

时间:2014-08-05 14:37:59

标签: android xml button

我必须做一些非常愚蠢的事情。这是我的第二个应用程序 - 第一个工作正常(诚实)。

我刚刚有一个带有按钮的基本标题屏幕,但是当我点击按钮时没有任何反应。屏幕显示正确,但按钮没有响应 - 我已经在调试中尝试了但没有...没有错误,没有信息消息,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>

有人看到我必须犯下的明显错误吗?

1 个答案:

答案 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代替CreateNewGameActivityFragments应该被称为Activities
  • 使用FragmentsActivities的黄金时代结束了。自Fragments引入Button以来,Activity只是Fragment的容器。因此,即使您的布局中只有一个Fragment,也应该有一个空的android:onClick,其中只包含一个View,并且在Fragment中您实现了您的UI和逻辑。 / LI>
  • 请勿使用Activity。代码中没有任何迹象表明将调用此方法。并且布局没有理由假设这样的方法存在于加载布局的OnClickListenerButtonandroid:onClick中的任何位置。除此之外,它甚至不那么方便。在您需要设置{{1}}的所有情况中,99.9%您还需要使用{{1}}执行其他操作,然后您还需要参考。 {{1}}只会使您的代码混乱并使其更加混乱。它将实现细节传播出去,并将其模糊给开发人员。布局知道甚至定义具体的实现细节本身已经非常糟糕了。