返回主按钮 activity 提高 "Unfortunately Application has stopped"
Back button to main activity raises "Unfortunately Application has stopped"
首先,如果问题变得太长,请原谅我:)
我写了一个(非常)简单的程序,叫做 TwoActivity
,但我遇到了一个错误。
程序
该程序的目的是询问用户 his/her 姓名并在另一个 activity 中打印 Hello, <name>
。该计划包括两个活动:First
和 Second
。 First
本身包含一个用于获取用户名称的 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);
}
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
之前已经创建过,所以我不能
再次 . 的意图
所以,我改了程序,看看我的傻猜是不是真的傻。他们确实如此。
程序重做了
我在程序中添加了另一个 activity,名为 Third
。我还向 First
添加了另一个按钮,以便用户可以将 his/her 名称发送到 Second
或 Third
。我还向 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?
祝福..!!
此答案基于 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
首先,如果问题变得太长,请原谅我:)
我写了一个(非常)简单的程序,叫做 TwoActivity
,但我遇到了一个错误。
程序
该程序的目的是询问用户 his/her 姓名并在另一个 activity 中打印 Hello, <name>
。该计划包括两个活动:First
和 Second
。 First
本身包含一个用于获取用户名称的 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);
}
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
之前已经创建过,所以我不能 再次 . 的意图
所以,我改了程序,看看我的傻猜是不是真的傻。他们确实如此。
程序重做了
我在程序中添加了另一个 activity,名为 Third
。我还向 First
添加了另一个按钮,以便用户可以将 his/her 名称发送到 Second
或 Third
。我还向 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?
祝福..!!
此答案基于 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