主要活动的后退按钮引发“遗憾的是应用已停止”

时间:2016-01-22 17:21:27

标签: android button android-intent android-activity onclick

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

我写了一个(非常)简单的程序,名为TwoActivity,我收到了一个错误。

程序

该计划的目的是询问用户他/她的名字并在另一项活动中打印Hello, <name>。该计划包含两项活动:FirstSecondFirst本身包含一个EditText来获取用户名和一个允许用户提交名称的按钮。 Second包含一个用于打印hello表达式的TextView和一个用于返回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);
}
M中的

Second

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.

我的方法

此时,经过一些谷歌搜索并没有发现任何内容,我做了一些愚蠢的猜测

  • 愚蠢的猜测#1 :因为First是该计划的MainActivity, 我无法表达意图。
  • 愚蠢的猜测#2 :因为之前创建了First,我无法制作 意图再次

所以,我改变了程序,看看我的愚蠢猜测是否真的很愚蠢。他们确实如此。

重写了

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

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

ThirdSecond完全相同。它有两个按钮。第一个意图是First(因此它是后退按钮),第二个按钮意图Second并创建它。

更奇怪的行为

此时,我的行为非常奇怪。当我触摸Third中的按钮时,程序正常工作。但是当我触摸Second中的相同后退按钮时,程序会给出前面提到的错误。此外,当我触摸Third中的按钮以转到Second时,该程序也能正常工作,但在Second中它会引发错误。总之,程序正常工作,直到您输入Second。触摸Second中的两个按钮都会出错。我根本无法理解这是什么问题。

评论 :请注意,如果我按下手机本身的后退按钮,或者我FirstSecond的父母并使用操作栏中的后退按钮,程序正常工作。

更新

这是引发错误时返工程序的堆栈跟踪(当我点击按钮(标识为button2to3new)从Second转到Third时,会出现此错误。单击按钮返回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$1.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$1.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用于将用户从Second带到我的活动类中的Third的按钮,但我有:

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"
...
/>

2 个答案:

答案 0 :(得分:1)

此答案基于mohammad .k复制到chat

的完整代码

请注意错误消息是

  

无法在活动类android.support.v7.internal.view.ContextThemeWrapper中找到onClickNext(View)方法,用于视图类android.support.v7.widget.AppCompatButton上的onClick处理程序

因此 AppCompatButton 缺少一种方法,但Second扩展了ActionBarActivity。为什么按钮被视为 AppCompatButton ?为什么只有Second中的按钮?

比较布局文件,结果表明第二个Activity的布局包含行

  

机器人:主题=&#34; @风格/ AppTheme&#34;

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

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

因此,布局文件中的Button元素被视为属于 AppCompat Universe,在幕后,当运行时请求{时,旧的已弃用的ActionBarActivity无法正确回答{1}}方法... BOOM

解决方案:删除OnClickListener

答案 1 :(得分:0)

以下是导航到下一个活动的正确/更好的方法,您需要尝试一下。

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

<强> FirstActivity

<强> XML: 从XML中删除onclick。

<Button
...
android:id="@+id/button1to2new"
...
/>

<强>爪哇

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);
    }
  });

}

然后在第二个活动中

<强> 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));
}

上述代码适用于在活动之间传递数据。

如果您想要返回或关闭当前活动,只需在任何点击监听器中按/按{/ 1}}。

其他链接:

How do I pass data between Activities in Android application?

Passing data

Android intent

祝福...... !!