【问题标题】:App crashes when changing activities更改活动时应用程序崩溃
【发布时间】:2021-04-29 07:17:17
【问题描述】:

由于我有编程经验,因此我自愿帮助我所在的社区开发 Android 应用程序。此应用程序的一部分是需要从一个 Activity 更改为另一个。当我尝试运行代码来执行此操作时,程序在 LogCat 中崩溃并出现以下异常:

 03-16 20:25:29.164: ERROR/AndroidRuntime(497): FATAL EXCEPTION: main
    03-16 20:25:29.164: ERROR/AndroidRuntime(497): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.a.android.app/com.a.android.app.Card}: java.lang.InstantiationException: com.a.android.app.Card
    03-16 20:25:29.164: ERROR/AndroidRuntime(497): at android.app.ActivityThread.performLaunchActivity(A ctivityThread.java:2585)
    03-16 20:25:29.164: ERROR/AndroidRuntime(497): at android.app.ActivityThread.handleLaunchActivity(Ac tivityThread.java:2679)
    03-16 20:25:29.164: ERROR/AndroidRuntime(497): at android.app.ActivityThread.access$2300(ActivityThr ead.java:125)
    03-16 20:25:29.164: ERROR/AndroidRuntime(497): at android.app.ActivityThread$H.handleMessage(Activit yThread.java:2033)
    03-16 20:25:29.164: ERROR/AndroidRuntime(497): at android.os.Handler.dispatchMessage(Handler.java:99 )
    03-16 20:25:29.164: ERROR/AndroidRuntime(497): at android.os.Looper.loop(Looper.java:123)
    03-16 20:25:29.164: ERROR/AndroidRuntime(497): at android.app.ActivityThread.main(ActivityThread.jav a:4627)
    03-16 20:25:29.164: ERROR/AndroidRuntime(497): at java.lang.reflect.Method.invokeNative(Native Method)
    03-16 20:25:29.164: ERROR/AndroidRuntime(497): at java.lang.reflect.Method.invoke(Method.java:521)
    03-16 20:25:29.164: ERROR/AndroidRuntime(497): at com.android.internal.os.ZygoteInit$MethodAndArgsCa ller.run(ZygoteInit.java:868)
    03-16 20:25:29.164: ERROR/AndroidRuntime(497): at com.android.internal.os.ZygoteInit.main(ZygoteInit .java:626)
    03-16 20:25:29.164: ERROR/AndroidRuntime(497): at dalvik.system.NativeStart.main(Native Method)
    03-16 20:25:29.164: ERROR/AndroidRuntime(497): Caused by: java.lang.InstantiationException: com.a.android.app.Card
    03-16 20:25:29.164: ERROR/AndroidRuntime(497): at java.lang.Class.newInstanceImpl(Native Method)
    03-16 20:25:29.164: ERROR/AndroidRuntime(497): at java.lang.Class.newInstance(Class.java:1429)
    03-16 20:25:29.164: ERROR/AndroidRuntime(497): at android.app.Instrumentation.newActivity(Instrument ation.java:1021)
    03-16 20:25:29.164: ERROR/AndroidRuntime(497): at android.app.ActivityThread.performLaunchActivity(A ctivityThread.java:2577)

在谷歌上搜索了一段时间后,我发现了一些建议,可能是第二个活动没有在我的 AndroidManifest.xml 文件中正确注册。我通过eclipse的GUI添加了第二个Activity,所以我很确定它很好,但以防万一,这里是XML文件的Application节点

<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".Main"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:icon="@drawable/icon" android:name="Card" android:label="@string/app_name"></activity>
</application>

我尝试过使用和不使用快捷方式“。”在“卡片”前面为活动名称。两者都会在 LogCat 中导致相同的错误。

只是为了更好的衡量,这是我用来尝试进入第二个活动的代码:

Intent i = new Intent(this, Card.class);
i.putExtra("id", id);
i.putExtra("searchText", m_SearchText.getText());
startActivityForResult(i, 1);

这可能是什么原因造成的?如果对我发布其他内容有帮助,请告诉我。这个错误让我困扰了几天,我根本找不到太多关于它的信息。

编辑:这是第二个活动的代码。不知道是什么原因造成的,所以都贴出来了。

public class Card extends Activity
{

    private int m_Id;
    private EditText m_SearchText;

    public Card(Bundle savedInstanceState)
    {
        try
        {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.card);

            Bundle extras = getIntent().getExtras();
            if(extras == null)
            {
                // nothing to do here
                return;
            }

            m_Id = extras.getInt("id");

            m_SearchText = (EditText)findViewById(R.id.txtSearch2);
            m_SearchText.setText(extras.getString("searchText"));

            Button search = (Button)findViewById(R.id.btnSearch2);

            search.setOnClickListener(new View.OnClickListener() { 
                public void onClick(View v) { 
                    ReturnToMain(m_SearchText.getText());
                }
            }); 

            m_SearchText.addTextChangedListener(new TextWatcher(){
                public void afterTextChanged(Editable s) { }

                public void beforeTextChanged(CharSequence s, int start, int count, int after)
                {
                    ReturnToMain(s);
                }

                public void onTextChanged(CharSequence s, int start, int before, int count) {}
            });

            new LongOperation().execute(this);
        }
        catch(Exception ex)
        {
            ShowError(ex.getMessage() + "\n" + ex.toString(), "Create Card");
            ex.printStackTrace();
        }
    }

    private void ReturnToMain(CharSequence s)
    {
        Intent i = new Intent();
        i.putExtra("searchText", s);
        setResult(RESULT_OK, i);
    }

    private void ShowError(String message, String title)
    {
        new AlertDialog.Builder(this)
        .setTitle("Error! - " + title)
        .setMessage(message)
        .setNeutralButton("Ok", 
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) { }
        })
        .show();
    }

    private class LongOperation extends AsyncTask<Context, Void, String> {

        String cardNumber;
        String sortName;
        String cardName;
        String cardType;
        String tr3CardType;
        String attribute;
        String level;
        String icon;
        String atk;
        String def;
        String cardText;
        String cardRulings;

        Context currentContext;

        @Override
        protected String doInBackground(Context... params) {
            try {
                currentContext = params[0];
                // search the database for everything with given id
                DataBaseHelper myHelper = new DataBaseHelper(currentContext);

                try
                {
                    myHelper.createDataBase();
                }
                catch(IOException ioe)
                {
                    ShowError(ioe.getMessage(), "CDB");
                }

                try
                {
                    myHelper.openDataBase();
                }
                catch(SQLException sqle)
                {
                    ShowError(sqle.getMessage(), "ODB");
                }

                Cursor results = myHelper.ExecSql("SELECT [CardNumber], [SortName], [CardName], [CardType], [Tr3CardType], [Attribute], [Level], [Icon], [ATK], [DEF], [CardText], [CardRulings] FROM Card WHERE _id = " + String.valueOf(m_Id), null);

                results.moveToPosition(0);
                cardNumber = results.getString(1);
                sortName = results.getString(2);
                cardName = results.getString(3);
                cardType = results.getString(4);
                tr3CardType = results.getString(5);
                attribute = results.getString(6);
                level = results.getString(7);
                icon = results.getString(8);
                atk = results.getString(9);
                def = results.getString(10);
                cardText = results.getString(11);
                cardRulings = results.getString(12);

                results.close();

                results = myHelper.ExecSql("SELECT [CardName], [CardRulings] FROM Card WHERE CardRulings LIKE '%" + cardName + "%'", null);

                results.moveToFirst();
                while(!results.isAfterLast())
                {
                    String[] individualRulings = results.getString(2).split("<br>");
                    for (int i = 0; i < individualRulings.length; i++)
                    {
                        if (individualRulings[i].contains(cardName))
                        {
                            cardRulings += "\n\n[" + results.getString(1) + "]:  " + individualRulings[i];
                        }
                    }
                    results.moveToNext();
                }

                results.close();

                myHelper.close();
            } catch (Exception e) {
                ShowError(e.toString() + "\n" + e.getMessage(), "Thread");
            }

            return "";
        }

        /* (non-Javadoc)
         * @see android.os.AsyncTask#onPostExecute(java.lang.Object)
         */
        @Override
        protected void onPostExecute(String result) {
            try {
                // execution of result of Long time consuming operation
                ((TextView)findViewById(R.id.lblSortName)).setText(sortName);
                ((TextView)findViewById(R.id.lblCardName)).setText(cardName);
                ((TextView)findViewById(R.id.lblCardText)).setText(cardText);
                ((TextView)findViewById(R.id.lblCardNum)).setText("(" + cardNumber + ")");
                ((TextView)findViewById(R.id.lblCardRulings)).setText(cardRulings);

                if(tr3CardType == "Monster")
                {
                    ((TextView)findViewById(R.id.lblCardLevelAttr)).setText(", " + level + ", " + attribute);
                    ((TextView)findViewById(R.id.lblCardType)).setText(cardType + ", " + atk + "/" + def);
                }
                else
                {
                    ((TextView)findViewById(R.id.lblCardLevelAttr)).setText("");
                    if (icon != "")
                    {
                        ((TextView)findViewById(R.id.lblCardType)).setText(cardType + " (" + icon + ")");
                    }
                    else
                    {
                        ((TextView)findViewById(R.id.lblCardType)).setText(cardType);
                    }
                }

            } catch (Exception e) {
                ShowError(e.getMessage() + "\n" + e.toString(), "After Thread");
                e.printStackTrace();
            }
        }

        /* (non-Javadoc)
         * @see android.os.AsyncTask#onPreExecute()
         */
        @Override
        protected void onPreExecute() {
        // Things to be done before execution of long running operation. For example showing ProgessDialog
        }

        /* (non-Javadoc)
         * @see android.os.AsyncTask#onProgressUpdate(Progress[])
         */
        @Override
        protected void onProgressUpdate(Void... values) {
          // Things to be done while execution of long running operation is in progress. For example updating ProgessDialog
         }
    }
}

【问题讨论】:

  • 粘贴您的代码以进行第二个活动
  • 而且由于您是 Stack Overflow 的新手,请不要忘记接受答案并为他人提供反馈。祝你好运。

标签: android


【解决方案1】:

您应该覆盖onCreate(Bundle) 而不是填写默认的类构造函数。像这样:

public void onCreate(Bundle savedInstanceState){
      super.onCreate(savedInstanceState);
      setContentView(R.layout.card);
      ....
}

如果您不熟悉 Activity lifecycles,最好花点时间阅读它们。系统将自动调用onCreate()onDestroy()和更多必要的方法来分配和释放资源,而不是调用类构造函数来启动一个Activity。

【讨论】:

  • 哇...用代码更新帖子。就是这样...点击该链接并查看文档。不敢相信你的主要作品。
  • 我是个白痴......我知道它必须是简单的......:S感谢永恒的帮助
  • 没问题。如果这是您第一次使用 Android,这是一个可以理解的错误。请务必阅读文档或租/买一本书以帮助了解 Android 的大图主题
【解决方案2】:

我不确定,但当前活动Context 可能存在问题。所以我建议你应该尝试:

Intent i = new Intent(Main.this, Card.class);

这里也发布第二个活动的代码。

【讨论】:

  • 感谢您的建议。这会导致 LogCat 中出现相同的异常
  • @rwakelan:参考 @eternalmatt 的答案。您必须在 Activity 中覆盖 onCreate() 方法。
【解决方案3】:

我认为您在清单中的 Card 类之前缺少一个句点。见下文:

发件人:

http://developer.android.com/guide/topics/manifest/activity-element.html

android:name

实现activity的类名,Activity的子类。属性值应该是完全限定的类名(例如,"com.example.project.ExtracurricularActivity")。但是,作为简写,如果名称的第一个字符是句点(例如,".ExtracurricularActivity"),则会将其附加到元素中指定的包名称中。 没有默认值。必须指定名称。

【讨论】:

  • 只要把 android:name="Card" 改成 android:name=".Card" 就跟 Main Activity 是 android:name=".Main" 一样
  • 我认为他尝试过:“我已经尝试过使用和不使用快捷方式“。”在“卡片”前面作为活动名称。两者都会导致 LogCat 出现相同的错误。”
  • 我会等待用户的反馈,但我想看到其他活动的一些代码会很好。
  • 另外,com.a.android.app.Card 看起来像卡片一样通用。有人对此有意见吗?
  • 它当然不是最好的命名方案,但我怀疑它是问题的原因。是否与清单文件中与 Main 具有相同标签的 Card 有关?
【解决方案4】:

我能够通过扩展两个活动来解决我的问题活动。 最初,它崩溃了,因为第一个 Activity 扩展了 Activity 而第二个扩展了 AppCompatActivity

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多