返回主按钮 activity 提高 "Unfortunately Application has stopped"

Back button to main activity raises "Unfortunately Application has stopped"

首先,如果问题变得太长,请原谅我:)

我写了一个(非常)简单的程序,叫做 TwoActivity,但我遇到了一个错误。

程序

该程序的目的是询问用户 his/her 姓名并在另一个 activity 中打印 Hello, <name>。该计划包括两个活动:FirstSecondFirst 本身包含一个用于获取用户名称的 EditText 和一个允许用户提交名称的按钮。 Second 由一个 TextView 打印 hello 表达式和一个按钮 return 到 First 组成。

这是代码:

onClick 中按钮的方法 First:

public void onClickGoToSecond(View view)
{
    Intent i=new Intent(this,Second.class);
    EditText e=(EditText) findViewById(R.id.editText);
    i.putExtra(Second.M,e.getText().toString());
    startActivity(i);
}

MSecond:

public static final String M="message";

onCreate()Second:

protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_second);
    Intent i=getIntent();
    TextView t=(TextView) findViewById(R.id.textView);
    t.setText("Hello "+i.getStringExtra(M));
}

onClick 中按钮的方法 Second:

public void onClickGoBack(View view)
{
    Intent i=new Intent(this,First.class);
    startActivity(i);
}

我觉得其他部分的代码就不用多说了吧

问题

问题是,当我转到 Second 并触摸按钮时,程序被强制关闭并给出错误

Unfortunately, TwoActivity has stopped.

我的方法

在这一点上,经过一番谷歌搜索后一无所获,我做了一些愚蠢的猜测

所以,我改了程序,看看我的傻猜是不是真的傻。他们确实如此。

程序重做了

我在程序中添加了另一个 activity,名为 Third。我还向 First 添加了另一个按钮,以便用户可以将 his/her 名称发送到 SecondThird。我还向 Second 添加了另一个按钮,它对 Third 做出了意图并创建了它,就像这样:
Second 中第二个按钮的 onClick

public void onClickNext(View view)
{
    Intent i=new Intent(this,Third.class);
    startActivity(i);
}

Third 完全像 Second。它有两个按钮。第一个意图 First(所以它是后退按钮),第二个按钮意图 Second 并创建它。

更奇怪的行为

此时,我遇到了一个非常奇怪的行为。当我触摸 Third 中的后退按钮时,程序运行正常。但是当我在 Second 中触摸相同的后退按钮时,程序给出了前面提到的错误。此外,当我触摸 Third 中的按钮以转到 Second 时,程序也可以正常工作,但在 Second 中会引发错误。总的来说,程序可以正常工作,直到您输入 Second。触摸 Second 中的两个按钮都会出错。我完全不明白这是什么问题。

评论:请注意,如果我按下 phone 本身的后退按钮,或者如果我使 First 成为Second 并在操作栏中使用后退按钮,程序运行正常。

更新

这是出现错误时重新编写的程序的堆栈跟踪(当我单击按钮(带有 id button2to3new)从 Second 转到 Third 时出现此错误.同样的错误发生在我点击按钮从return到First时:

Process: com.example.mohammad.twoactivity, PID: 7564
    java.lang.IllegalStateException: Could not find a method onClickNext(View) in the activity class android.support.v7.internal.view.ContextThemeWrapper for onClick handler on view class android.support.v7.widget.AppCompatButton with id 'button2to3new'
            at android.view.View.onClick(View.java:3966)
            at android.view.View.performClick(View.java:4652)
            at android.view.View$PerformClick.run(View.java:19319)
            at android.os.Handler.handleCallback(Handler.java:733)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:146)
            at android.app.ActivityThread.main(ActivityThread.java:5641)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1288)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1104)
            at dalvik.system.NativeStart.main(Native Method)
     Caused by: java.lang.NoSuchMethodException: onClickNext [class android.view.View]
            at java.lang.Class.getConstructorOrMethod(Class.java:472)
            at java.lang.Class.getMethod(Class.java:857)
            at android.view.View.onClick(View.java:3959)
            at android.view.View.performClick(View.java:4652)
            at android.view.View$PerformClick.run(View.java:19319)
            at android.os.Handler.handleCallback(Handler.java:733)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:146)

第二行说我没有 onClickNext() 方法作为 onClick 用于在我的 activity 中将用户从 Second 带到 Third 的按钮class,但我有:

public void onClickBack(View view)
{
    Intent i=new Intent(this,First.class);
    startActivity(i);
}
public void onClickNext(View view)
{
    Intent i=new Intent(this,Third.class);
    startActivity(i);
}

这是 activity_second 布局文件的一部分:

<Button
...
android:id="@+id/button2to3new"
android:onClick="onClickNext"
...
/>

这是导航到下一个 activity 的正确/更好的方法,您需要试一试。

您可以为将导航到下一个 activity 的按钮/视图使用 onclicklisteners,而不是在 XML 中指定函数。往下看

FirstActivity

XML: 从 XML.

中删除 onclick
<Button
...
android:id="@+id/button1to2new"
...
/>

Java

protected void onCreate (Bundle savedInstanceState)
{
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_first);

  EditText e = (EditText) findViewById(R.id.editText);
  Button nextButton = (Button) findViewById(R.id.button1to2new);
  nextButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
      Intent i = new Intent(FirstActivity.this, Second.class);
      i.putExtra("user_data_1", e.getText().toString()); // user_data_1 is the key which is used in the next activity to retrieve the data.
      startActivity(i);
    }
  });

}

然后在第二个activity

SecondActivity

protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_second);
    Intent i=getIntent();
    TextView t=(TextView) findViewById(R.id.textView);
    t.setText("Hello "+i.getStringExtra(""user_data_1));
}

以上代码可以很好地在活动之间传递数据。

如果您想返回或关闭当前 activity,只需在任何点击侦听器中按返回键/使用 finish();

其他链接:

How do I pass data between Activities in Android application?

Passing data

Android intent

祝福..!!

此答案基于 mohammad .k copied to chat

的完整代码

请注意,错误消息是

Could not find a method onClickNext(View) in the activity class android.support.v7.internal.view.ContextThemeWrapper for onClick handler on view class android.support.v7.widget.AppCompatButton

所以 AppCompatButton 缺少一个方法,但是 Second 扩展了 ActionBarActivity。为什么按钮被视为 AppCompatButton?为什么只有 Second 中的按钮?

比较布局文件,发现第二个 Activity 的布局包含行

android:theme="@style/AppTheme"

就是这样:我们仁慈的 IDE(Android Studio?)生成了 AppTheme 作为

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">

所以布局文件中的 Button 元素被视为属于 AppCompat 宇宙,而在幕后,可怜的旧的已弃用的 ActionBarActivity 在运行时要求 OnClickListener 方法...BOOM

解决方法:去掉android:theme