首先,如果问题变得太长,请原谅我:)
我写了一个(非常)简单的程序,名为TwoActivity
,我收到了一个错误。
该计划的目的是询问用户他/她的名字并在另一项活动中打印Hello, <name>
。该计划包含两项活动:First
和Second
。 First
本身包含一个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.
此时,经过一些谷歌搜索并没有发现任何内容,我做了一些愚蠢的猜测:
First
是该计划的MainActivity
,
我无法表达意图。First
,我无法制作
意图再次。所以,我改变了程序,看看我的愚蠢猜测是否真的很愚蠢。他们确实如此。
我在程序中添加了另一个名为Third
的活动。我还在First
添加了另一个按钮,以便用户可以将他/她的名字发送到Second
或Third
。我还向Second
添加了另一个按钮,该按钮向Third
发出了意图并创建了它,就像这样:
onClick
中第二个按钮的Second
:
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
中的两个按钮都会出错。我根本无法理解这是什么问题。
评论 :请注意,如果我按下手机本身的后退按钮,或者我First
为Second
的父母并使用操作栏中的后退按钮,程序正常工作。
这是引发错误时返工程序的堆栈跟踪(当我点击按钮(标识为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"
...
/>
答案 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?
祝福...... !!