【问题标题】:Linking button to next android activity crashes app将按钮链接到下一个 android 活动会使应用程序崩溃
【发布时间】:2014-04-01 05:05:42
【问题描述】:

当我单击 activity_main.xml 底部的按钮时,我试图让我的应用程序转到 activity_vehicle.xml。当我点击它时,应用程序崩溃了,我的日志文件中有很多垃圾。我正在使用 android sdk 插件运行 eclipse。作为旁注,当我尝试在文本字段中输入文本时,它是日文的,并且屏幕的行为就像是转了很长一段路,而不是直立。

这是从按钮所在的activity_main.xml中获取的按钮代码

<Button
    android:id="@+id/destination_next_button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:layout_alignParentRight="true"
    android:layout_marginBottom="22dp"
    android:layout_marginRight="37dp"
    android:text="Next" />

这是我声明第二个活动的 android manifest 类

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.google.android.gms"
android:versionCode="1"
android:versionName="1.0" >

<uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="18" />

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name="com.google.android.gms.MainActivity"
        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:name="com.google.android.gms.Vehicle"
        android:label="@string/title_activity_vehicle" >
                        <action android:name="com.google.android.gms.Vehicle" />

            <category android:name="android.intent.category.DEFAULT" />
    </activity>
</application>

这是我为按钮设置 onclick 侦听器的 MainActivity.java 文件。我假设新的启动活动将使用我拥有的 Vechicle.java 文件而不是 activity_vehicle.xml 文件

public class MainActivity extends Activity implements OnClickListener 
{

Button destination_next_button;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    destination_next_button = (Button)findViewById(R.id.destination_next_button);
    destination_next_button.setOnClickListener(this);

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

private void destination_next_buttonClick()
{
    startActivity(new Intent("com.google.android.gms.Vehicle"));
}

@Override
public void onClick(View v) {
    switch (v.getId())
    {
    case R.id.destination_next_button:
        destination_next_buttonClick();
        break;
    }

}

}

当项目运行时,LogCat 中会弹出以下错误,我删除了日期以确保它们中没有太多超过 1 行

D/AndroidRuntime(428): Shutting down VM
W/dalvikvm(428): threadid=1: thread exiting with uncaught exception (group=0x40014760)
E/AndroidRuntime(428): FATAL EXCEPTION: main
E/AndroidRuntime(428): android.content.ActivityNotFoundException: No Activity found to handle Intent { act=com.google.android.gms.Vehicle }

E/AndroidRuntime(428):  at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1508)

E/AndroidRuntime(428):  at android.app.Instrumentation.execStartActivity(Instrumentation.java:1382)

E/AndroidRuntime(428):  at android.app.Activity.startActivityForResult(Activity.java:3044)
E/AndroidRuntime(428):  at android.app.Activity.startActivity(Activity.java:3150)
E/AndroidRuntime(428):  at com.google.android.gms.MainActivity.destination_next_buttonClick(MainActivity.java:34)

E/AndroidRuntime(428):  at bsu.edu.cs222.gascalculator.MainActivity.onClick(MainActivity.java:42)

E/AndroidRuntime(428):  at android.view.View.performClick(View.java:3100)
E/AndroidRuntime(428):  at android.view.View$PerformClick.run(View.java:11644)
E/AndroidRuntime(428):  at android.os.Handler.handleCallback(Handler.java:587)
E/AndroidRuntime(428):  at android.os.Handler.dispatchMessage(Handler.java:92)
E/AndroidRuntime(428):  at android.os.Looper.loop(Looper.java:126)
E/AndroidRuntime(428):  at android.app.ActivityThread.main(ActivityThread.java:3997)
E/AndroidRuntime(428):  at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime(428):  at java.lang.reflect.Method.invoke(Method.java:491)
E/AndroidRuntime(428):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)

E/AndroidRuntime(428):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
E/AndroidRuntime(428):  at dalvik.system.NativeStart.main(Native Method)

【问题讨论】:

  • 即src文件夹下的java文件

标签: java android eclipse android-intent


【解决方案1】:

改变这个

  startActivity(new Intent("com.google.android.gms.Vehicle"));

  startActivity(new Intent(MainActivity.this,Vehicle.class));

您可以在匿名内部类中使用 MainActivity.this,因为在这种情况下 this 不是有效的上下文。

java.lang.Object
   ↳    android.content.Context // see this
       ↳    android.content.ContextWrapper
           ↳    android.view.ContextThemeWrapper
               ↳    android.app.Activity //see this

还有你的MainActivity extends Activtiy

  startActivity(new Intent(this,Vehicle.class));

this 指的是活动上下文。

改变这个

  <activity
    android:name="com.google.android.gms.Vehicle"
    android:label="@string/title_activity_vehicle" >
    <action android:name="com.google.android.gms.Vehicle" />
    <category android:name="android.intent.category.DEFAULT" />
 </activity>

  <activity
    android:name="com.google.android.gms.Vehicle"
    android:label="@string/title_activity_vehicle" >
  </activity> 

如果您引用 google play 服务并且有 import com.google.android.gms.maps.CameraUpdate; 等导入,最好更改您的包名称 coz。因此,最好将包名称更改为更相关的名称。 ` 使用显式意图。

显式意图指定以名称开头的组件( 完全限定的类名)。您通常会使用显式意图 在您自己的应用程序中启动一个组件,因为您知道类名 您要启动的活动或服务。例如,开始一个新的 响应用户操作或启动服务以下载 文件在后台。

【讨论】:

  • 没有必要在Intent 中使用MainActivity.this - 只需使用this 就足够了。
  • 正确。如果onClick(...) 方法在匿名OnClickListener 定义中,那么MainActivity.this 将是必需的,但在这种情况下不需要。
  • @Squonk 再次正确,因为在这种情况下,this 不是有效的上下文。
  • 没错。我在这里找到越来越多的答案,比如SomeActivity.this,当简单地使用this 就可以了。抱歉 - 这只是我目前拥有的东西,对于在这里提问的人来说,了解何时需要一个或另一个很重要。 :)
【解决方案2】:

试试这个..

startActivity(new Intent("com.google.android.gms.Vehicle")); 更改为startActivity(new Intent(MainActivity.this,Vehicle.class));

private void destination_next_buttonClick()
{
    startActivity(new Intent(MainActivity.this,Vehicle.class));
}

【讨论】:

    【解决方案3】:

    尝试更改此行:

    startActivity(new Intent("com.google.android.gms.Vehicle"));
    

    Intent myIntent = new Intent(MainActivity.this, YourOtherActivity.class);
        startActivity(myIntent); 
    

    尝试改变这一点

    <activity
        android:name="com.google.android.gms.Vehicle"
        android:label="@string/title_activity_vehicle" >
        <action android:name="com.google.android.gms.Vehicle" />
        <category android:name="android.intent.category.DEFAULT" />
     </activity>
    

     <activity
        android:name="com.google.android.gms.Vehicle"
        android:label="@string/title_activity_vehicle" >
      </activity> 
    

    最好更改你的包名。 希望对你有帮助。

    【讨论】:

    • 这不是我真正的包名,只是它给你的默认名称。更改它是为了发布而不是包含其中包含我学校名称的那个
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多