0

Android用のアプリケーションの新しいアップデートをテストしているときに、「オプションメニュー」(私が知っていること)を起動しようとすると、起動時にアプリケーションがクラッシュします。コードは次のとおりです。

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);

    if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)){
         Toast.makeText(this, "GPS'n är aktiverad på din mobilenhet", Toast.LENGTH_SHORT).show();
    }else{
        showGPSDisabledAlertToUser();
    }

    setContentView(R.layout.about);
    Button b = (Button) findViewById(R.id.menuItem1);
    b.setOnClickListener(new View.OnClickListener() {
       public void onClick(View arg0) {
       Intent i = new Intent(nowActivity.this, About.class);
       startActivity(i);
       } 
    });
}

そしてLogCat:

04-04 00:50:27.324: D/LocationManager(870): Constructor: service = android.location.ILocationManager$Stub$Proxy@44e95640
04-04 00:50:27.374: D/AndroidRuntime(870): Shutting down VM
04-04 00:50:27.374: W/dalvikvm(870): threadid=3: thread exiting with uncaught exception (group=0x4001b188)
04-04 00:50:27.374: E/AndroidRuntime(870): Uncaught handler: thread main exiting due to uncaught exception
04-04 00:50:27.384: E/AndroidRuntime(870): java.lang.RuntimeException: Unable to start activity ComponentInfo{weather.right.now/weather.right.nowActivity}: java.lang.NullPointerException
04-04 00:50:27.384: E/AndroidRuntime(870):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2496)
04-04 00:50:27.384: E/AndroidRuntime(870):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512)
04-04 00:50:27.384: E/AndroidRuntime(870):  at android.app.ActivityThread.access$2200(ActivityThread.java:119)
04-04 00:50:27.384: E/AndroidRuntime(870):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1863)
04-04 00:50:27.384: E/AndroidRuntime(870):  at android.os.Handler.dispatchMessage(Handler.java:99)
04-04 00:50:27.384: E/AndroidRuntime(870):  at android.os.Looper.loop(Looper.java:123)
04-04 00:50:27.384: E/AndroidRuntime(870):  at android.app.ActivityThread.main(ActivityThread.java:4363)
04-04 00:50:27.384: E/AndroidRuntime(870):  at java.lang.reflect.Method.invokeNative(Native Method)
04-04 00:50:27.384: E/AndroidRuntime(870):  at java.lang.reflect.Method.invoke(Method.java:521)
04-04 00:50:27.384: E/AndroidRuntime(870):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
04-04 00:50:27.384: E/AndroidRuntime(870):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
04-04 00:50:27.384: E/AndroidRuntime(870):  at dalvik.system.NativeStart.main(Native Method)
04-04 00:50:27.384: E/AndroidRuntime(870): Caused by: java.lang.NullPointerException
04-04 00:50:27.384: E/AndroidRuntime(870):  at weather.right.nowActivity.onCreate(nowActivity.java:37)
04-04 00:50:27.384: E/AndroidRuntime(870):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
04-04 00:50:27.384: E/AndroidRuntime(870):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2459)
04-04 00:50:27.384: E/AndroidRuntime(870):  ... 11 more
04-04 00:50:27.404: I/dalvikvm(870): threadid=7: reacting to signal 3
04-04 00:50:27.424: E/dalvikvm(870): Unable to open stack trace file '/data/anr/traces.txt': Permission denied

私は現在、適切なAndroidアプリケーションを構築することを学んでいるので、ここで何が問題なのかわかりません。何が悪いのか知っていますか?

前もって感謝します!

編集:About.java

package weather.right;

import weather.right.now.R;
import android.app.Activity;
import android.os.Bundle;

public class About extends Activity {
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.about);
    }

}

編集:nowActivity.java

package weather.right;

// import java.util.Calendar;

import weather.right.now.R;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.location.LocationManager;
import android.net.Uri;
import android.os.Bundle;
// import android.view.Menu;
// import android.view.MenuInflater;
// import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class nowActivity extends Activity {

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);

        if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)){
             Toast.makeText(this, "GPS'n är aktiverad på din mobilenhet", Toast.LENGTH_SHORT).show();
        }else{
            showGPSDisabledAlertToUser();
        }

        setContentView(R.layout.about);
        Button b = (Button) findViewById(R.id.menuItem1);
        b.setOnClickListener(new View.OnClickListener() {
           public void onClick(View arg0) {
           Intent i = new Intent(nowActivity.this, About.class);
           startActivity(i);
           } 
        });
    }

    @Override
    public void onBackPressed() {
        System.exit(0);
        return;
    }
 /*
    @Override
    public boolean onCreateOptionsMenu(Menu menu)
    {
        MenuInflater menuInflater = getMenuInflater();
        menuInflater.inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item)
    {
        // Calendar c = Calendar.getInstance();
        // int year = c.get(Calendar.YEAR);

        // Handle item selection
        switch (item.getItemId())
        {
        case R.id.menuItem1:
            // Toast.makeText(nowActivity.this, "Copyright " + year + " Erik Edgren", 3000).show();
            setContentView(R.layout.about);
            return true;
        case R.id.menuItem2:
            System.exit(0);
            return true;
        default:
            return super.onOptionsItemSelected(item);
        }
    }
    */



    public void goToSo(View view) {
        goToUrl("http://erik-edgren.nu/weather");
        System.exit(0);
    }

    private void goToUrl(String url) {
        Uri uriUrl = Uri.parse(url);
        Intent launchBrowser = new Intent(Intent.ACTION_VIEW, uriUrl);
        startActivity(launchBrowser);
        System.exit(0);
    }



    private void showGPSDisabledAlertToUser(){
    AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
            alertDialogBuilder.setMessage("GPS-mottagaren är inte aktiverad på din mobil. För att tjänsten ska kunna hitta dig, måste den vara aktiverad.")
         .setCancelable(false)
         .setPositiveButton("Gå till inställningarna",
              new DialogInterface.OnClickListener(){
              public void onClick(DialogInterface dialog, int id){
                      Intent callGPSSettingIntent = new Intent(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                      startActivity(callGPSSettingIntent);
                      System.exit(0);
              }
         });
         alertDialogBuilder.setNegativeButton("Stäng",
              new DialogInterface.OnClickListener(){
              public void onClick(DialogInterface dialog, int id){
                   dialog.cancel();
                   System.exit(0);
              }
         });
    AlertDialog alert = alertDialogBuilder.create();
    alert.show();
    }
}

編集:AndroidManifest.xml

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

    <uses-sdk android:minSdkVersion="7" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

    <application
        android:icon="@drawable/sun_icon"
        android:label="@string/app_name" >
        <activity
            android:name="weather.right.nowActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

    <application
        android:icon="@drawable/sun_icon"
        android:label="@string/app_name" >
        <activity
            android:name="weather.right.About"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

編集:about.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <TextView
        android:layout_width="252dp"
        android:layout_height="wrap_content"
        android:layout_margin="15dp"
        android:text="@string/about" />

</LinearLayout>
4

3 に答える 3

2

ログにその行が表示Caused by: java.lang.NullPointerExceptionされていますか?そのすぐ下に線がありますat weather.right.nowActivity.onCreate(nowActivity.java:37)

これは、のNullPointerException行にスローされていることを意味37しますnowActivity。その行をダブルクリックすると、が開き、Activityエラーがスローされている場所に直接移動します。だから、それをすべて覚えておいてください。

私が気づいたことの1つはsetContentView、メソッドで2回使用していることですonCreateabout.xmlで使用したいようですAbout.class。また、Exceptionスローされているのがあなたのによって引き起こされていると思われる場合Menuは、OPに関連しているため、そのコードを投稿する必要があります。

37はあなたの開始と関係があるようAbout.classです。あなたがあなたにそれをタグ付けしていること、Manifestそしてあなたがあなたのために使用しているあなたButtonの一部であることを確認してください。LayoutnowActivity

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

<uses-sdk android:minSdkVersion="7" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

<application
    android:icon="@drawable/sun_icon"
    android:label="@string/app_name" >
    <activity
        android:name="weather.right.nowActivity"
        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="weather.right.About"
        android:label="@string/app_name" />
</application>

</manifest>

最初に開始する場合、またはアプリドロワーActivity内に表示される場合は、Intent-Filter投稿したタグをActivities含める必要がありますが、特定のタグを含める必要がない場合もありますが、必要な場合もありIntent-Filterます。また、あなたの中にあるものはすべて、 1つのタグと1つのタグの中に入れるAndroidManifest必要があります。 <manifest></manifest> <application></application>

于 2012-04-04T01:04:59.060 に答える
0

この行を変更してみてください:

Intent i = new Intent(nowActivity.this, About.class);

にとってIntent i = new Intent(getApplicationContext(), About.class);

フラグメントを使用している場合は、次を使用します。

Intent i = new Intent(getActivity().getApplicationContext(), About.class);

わかりました。View.onOnclickListernerを使用しています。Viewという単語を削除してみてください。:)だからそれはこのように見えます:

b.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub

            }
        });

レイアウトにボタンIDがあることを確認してください。注:最後setContentViewに使用しているのは:setContentView(R.layout.about);であるため、ボタンのIDはそのレイアウトに含まれている必要があります。

于 2012-04-04T01:06:15.800 に答える
0

ここであなたのコードを見てください。setContentViewへの呼び出しが2つありますが、これはかなり奇妙です。アバウトボックスを表示しようとしていると思いますが、本当に欲しいと思ったら電話するだけですsetContentView(R.layout.main);

NullPointerExceptionさて、あなたの理由Button b = (Button) findViewById(R.id.menuItem1);はnullだからだと思います。menu/フォルダにメニューXMLファイルを作成してメニューを作成したと思います。あなたが本当に探しているのは、layout/main.xmlを持っているボタンandroid:id="menuItem1"です。それが存在する場合はそれを見つけ、そうでない場合はnullを返します。このコードは、メニューxmlから作成されたことを意味します。その場合は、これを処理する方法です。

// Load the menu into the activity. Add this code to the activity class.
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.example_menu, menu);
    return true;
}

// Handler for menu selections.
@Override
public boolean onOptionsItemSelected(MenuItem item) {
  switch (item.getItemId()) {

  case R.id.menuItem1: {
    // do work.
  } break;
  default:
    return super.onOptionsItemSelected(item);
  }

  return true;
}
于 2012-04-04T01:24:25.197 に答える