【问题标题】:android: App crashes when calling method in Main activity from custom activityandroid:从自定义活动调用主活动中的方法时应用程序崩溃
【发布时间】:2014-03-09 09:17:55
【问题描述】:

我正在尝试构建一个类似测验的应用程序,用于在 android 中猜测标志。基本上我有一个名为 SetFlagActivity 的活动,如果单击按钮,它会从 MainActivity 中的 startFlagActivity(View v) 接收意图。它需要做两件事:#1 如果用户输入正确的标志名称加载新标志和#2 显示消息:“正确”否则只显示“错误”。

按下按钮时会显示正确的消息,但包含标志图像的 ImageView 会消失。同样,当再次单击该按钮时,应用程序崩溃并出现以下output:

我认为图像没有出现是因为它显示在 MainActivity 中,所以我使用 finish() 返回。这修复了应用程序崩溃,但是当我再次单击按钮时没有任何反应......没有显示任何消息。所以问题是我如何以正确的方式使用 SetFlagActivity 来显示我的消息并设置新图像..

我们将不胜感激。

这会获取输入并发送意图

public void startFlagActivity(View v){
    EditText flagInput = (EditText) findViewById(R.id.inputFlag);
    String message = flagInput.getText().toString();
    Intent intent = new Intent(MainActivity.this, SetFlagActivity.class);
    if(!message.equals(""))
        intent.putExtra("flag", message);
        MainActivity.this.startActivity(intent);
}

我的 SetFlagActivity 看起来像这样:

package ivve.projects.flags;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.TextView;

public class SetFlagActivity extends Activity {
  protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

    Button button= (Button) findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            startFlagActivity(v);
        }
    });
        TextView text = (TextView) findViewById(R.id.displayAnswer); 
        Intent intent = getIntent();
        String value = intent.getStringExtra("flag"); 
        if(value.equals("Iceland")){
            text.setText("correct");
        }
        else{
            text.setText("wrong"); 
        }
    finish();
    }
}

Edit1:StartFlagActivity 本身实际上并不是一个活动......它是 MainActivity 中的一个函数
Edit2:我已按照建议将 onClick 处理程序添加到我的 SetFlagActivity,但我收到一个错误“方法 startFlagActivity(View) is undefined for the type new View.OnClickListener(){}”不允许我调用 startFlagActivity 方法

【问题讨论】:

  • 'R.id.displayAnswer' 这个TextView属于哪个布局?另外,我觉得当你开始意图时,finish() 发生在 oncreate() 内部。这真的很快。您可以尝试在完成 1 秒之前提供一个等待计时器,例如 sleep() 或 wait(),以测试您的代码。
  • 我没有看到任何与你说的图片相关的代码??
  • R.id.displayAnswer 属于 activity_main.xml 布局。我应该在此活动中还是在我调用意图的活动中使用完成方法?
  • 您需要通过 startFlagActivity() 定义 onClickListener 方法,因为您已将 onClick() 方法设置为。
  • 啊.. 我知道你现在做了什么 - 我会编辑我的答案并指出你需要去的方向。

标签: android android-intent android-activity


【解决方案1】:

你已经在activity_main.xml中声明了按钮(id = button),并通过onClick属性设置了按钮的OnClickListener来引用startFlagActivity方法。您要做的是检查 TextView 是否包含正确答案,如果是,则继续,否则保留在此页面中。一个离题的建议是在 onCreate() 中初始化 TextView 变量。在这里,虽然它对您有用,但您每次单击时都会重新初始化它。

您现在已经在 MainActivity 中扩展了这个视图。

setContentView(R.layout.activity_main.xml); // This inflates the layout.
// Now you dynamically have set the flag. This is not part of the activity_main.xml

您已经在 MainActivity() 中声明了 startFlagActivity(),其背后的逻辑是应该启动新的 Activity(单击按钮时),并将答案作为参数传递给意图。新启动的intent会检查答案是否正确,如果是,会显示正确。

现在回答您的第一个问题,即图像视图消失。发生这种情况是因为您夸大了 activity_main.xml - 但是 ImageView 是在 MainActivity 中动态创建的,并且在 SetFlagActivity 中不存在(此屏幕中基本上没有图像)。这就是地图消失但您看到布局的其余部分保持不变的原因。

然后,当您再次单击按钮时,当前显示的活动 SetFlagActivity 不存在 onClick() 方法(或在本例中为 startFlagActivity() 方法),这就是您收到错误日志的原因SetFlagActivity 屏幕不存在 onClick() 方法 startFlagActivity()。我希望这是有道理的。现在单击该按钮不会产生任何结果,因为没有代码可以备份它(也会产生错误日志)。我希望你现在看到你的逻辑有缺陷的地方。

您无需开始新的活动。您可以根据 if-else 条件完成它。你的算法是:

If (answer = correct)
    setImageView -> new drawable;
    repeat process;
else
    show wrong and repeat;

我希望这会有所帮助。

【讨论】:

  • startFlagActivity 实际上是按钮的onClick事件函数。按钮在我的 main.xml 中定义,这个 android:onClick = "startFlagActivity"
  • 从您发布的日志中,应用程序希望 setFlagActivity() 中出现 startFlagActivity(View) - 但它不正确吗?您已在 SetFlagActivity 上扩展了 activity_main。如果这个按钮存在于activity_main.xml 中,那么SetFlagActivity 应该有方法startFlagActivity()。你能给我们看看activity_main.xml吗?
  • 这是我的activity_main.xml ......正如我所说的按钮在这里定义pastebin.com/XCSHw4Ni
  • 我编辑了答案。您已删除日志..您可以尝试我发布的内容并查看您收到的日志吗?
  • 你能解释一下按钮点击处理程序吗?我有点困惑...如果我在 SetFlagActivity 中定义按钮侦听器会做什么...如果单击按钮,我仍然必须从某个地方调用此活动?
【解决方案2】:
03-08 20:52:59.539: E/AndroidRuntime(9399): java.lang.IllegalStateException: Could not find a method startFlagActivity(View) in the activity class ivve.projects.flags.SetFlagActivity for onClick handler on view class android.widget.Button with id 'button'
03-08 20:52:59.539: E/AndroidRuntime(9399):     at android.view.View$1.onClick(View.java:2131)

您忘记在SetFlagActivity 中声明startFlagActivity(View)。可能你在SetFlagActivity中设置了错误的布局

【讨论】:

  • 我是否总是必须在被调用的活动中声明正在调用它的活动?你会怎么做?谢谢。
  • 我想说的是,我必须在我当前的活动中声明刚刚调用它的那个有点奇怪......
猜你喜欢
  • 1970-01-01
  • 2013-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-24
  • 1970-01-01
相关资源
最近更新 更多