Null Pointer Exception в андроиде при переключении активности - PullRequest
0 голосов
/ 13 июля 2011

Я только начал программировать для Android, когда мой начальник попросил меня сделать его мобильным приложением, поэтому я выполнил все это за два дня и научил себя, как я это делал, в основном с этого сайта. Я продолжаю получать nullPointerException, когда я запускаю свою программу и нажимаю на кнопку, которая переключает следующее действие

Первое занятие:

package com.Android.HelpDeskMobileApp;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class HelpDeskFront extends Activity{

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.first);
        Button serviceButton = (Button)findViewById(R.id.serviceButton),
                orderButton = (Button)findViewById(R.id.OrderButton),
                programmingButton = (Button)findViewById(R.id.ProgrammingButton);
        serviceButton.setOnClickListener(buttonListener);
        orderButton.setOnClickListener(buttonListener);
        programmingButton.setOnClickListener(buttonListener);
    }
    private OnClickListener buttonListener = new OnClickListener() {

        public void onClick(View v) {
            String serviceType = null;
            Intent i = new Intent(HelpDeskFront.this, Main.class);
            if (v.getId() == R.id.serviceButton)
                serviceType = "service";
            else if (v.getId() == R.id.OrderButton)
                serviceType = "order";
            else if (v.getId() == R.id.ProgrammingButton)
                serviceType = "programming";
            i.putExtra("serviceType", serviceType);
            startActivityForResult(i, Intent.FILL_IN_DATA);
        };
}

Кнопки ведут ко второму занятию:

package com.Android.HelpDeskMobileApp;

import java.util.ArrayList;

import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;

public class Main extends Activity{

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        final Button send = (Button)findViewById(R.id.sendRequest);
        send.setOnClickListener(buttonListener);
    }
    private OnClickListener buttonListener = new OnClickListener() {

        ArrayList<NameValuePair> data = new ArrayList<NameValuePair>(5);
        final EditText caller = (EditText) findViewById(R.id.CallerEnter), 
                 callExt = (EditText) findViewById(R.id.CallNumberEnter),
                 computerName = (EditText) findViewById(R.id.ComputerNameEnter),
                 location = (EditText) findViewById(R.id.LocationEnter),
                 request = (EditText) findViewById(R.id.RequestEnter);

        public void onClick(View v) {
                    Intent i = getIntent();
        final String serviceType = i.getStringExtra("serviceType");
            Intent intent = new Intent(Main.this, HelpDeskEnd.class);
            final String[] email = {"target emails"};
            data.add(new BasicNameValuePair("Caller: ", textToString(caller)));
            data.add(new BasicNameValuePair("Call Ext: ", textToString(callExt)));
            data.add(new BasicNameValuePair("Computer Name: ", textToString(computerName)));
            data.add(new BasicNameValuePair("Locations: ", textToString(location)));
            data.add(new BasicNameValuePair("Request: ", textToString(request)));
            sendData(data);

            String body = data.get(0).toString() + " " + data.get(1).toString() + " " +
                    data.get(2).toString() + " " + data.get(3).toString() + " " + 
                    data.get(4).toString();
            Mail mail = new Mail("an email", "email password");
            mail.setTo(email);
            mail.setBody(body);
            mail.setFrom("an email");
            mail.setSubject(serviceType);
            try {
                mail.send();
            }
            catch (Exception e) {
                 Log.e("Send Mail", e.getMessage(), e);
            }
            intent.putExtra("serivceType", serviceType);
            startActivity(intent);
        }

    };
    private String textToString(EditText x)
    {
        return x.getText().toString();
    }
    private void sendData(ArrayList<NameValuePair> data)
    {
        try {

            HttpClient httpclient = new DefaultHttpClient();
            HttpPost httpPost = new HttpPost("https//www.awebsite.com/phpfile.php");
            httpPost.setEntity(new UrlEncodedFormEntity(data));
            HttpResponse response = httpclient.execute(httpPost);
            Log.i("postData", response.getStatusLine().toString());
        }
        catch (Exception e){
            Log.e("log_tag", "Error: " + e.toString());
        }
    }
}

Вероятно, это действительно очень легко исправить. Спасибо за любую помощь. Вот мой файл манифеста, и я не знаю, насколько он полезен, но вот он:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.Android.HelpDeskMobileApp"
      android:versionCode="1"
      android:versionName="1.0">
    <uses-sdk android:minSdkVersion="12" />
    <uses-permission android:name="android.permission.INTERNET" />

    <application android:icon="@drawable/logo" android:label="@string/app_name">
        <activity android:name=".HelpDeskFront"
                  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:label="@string/app_name" 
                  android:name=".Main">
                  <intent-filter></intent-filter>
        </activity>
        <activity android:label="@string/app_name" 
                  android:name=".HelpDeskEnd">
                  <intent-filter></intent-filter>
        </activity>

    </application>
</manifest>

Ошибка происходит, когда я нажимаю кнопку, чтобы перейти от первого действия к .main. Я пытался закомментировать различные части кода, но не могу понять, что вызывает исключение нулевого указателя. Благодарю. log cat:

    07-13 18:37:29.833: ERROR/AndroidRuntime(770): FATAL EXCEPTION: main
07-13 18:37:29.833: ERROR/AndroidRuntime(770): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.Android.HelpDeskMobileApp/com.Android.HelpDeskMobileApp.Main}: java.lang.NullPointerException
07-13 18:37:29.833: ERROR/AndroidRuntime(770):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1672)
07-13 18:37:29.833: ERROR/AndroidRuntime(770):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1764)
07-13 18:37:29.833: ERROR/AndroidRuntime(770):     at android.app.ActivityThread.access$1500(ActivityThread.java:122)
07-13 18:37:29.833: ERROR/AndroidRuntime(770):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1002)
07-13 18:37:29.833: ERROR/AndroidRuntime(770):     at android.os.Handler.dispatchMessage(Handler.java:99)
07-13 18:37:29.833: ERROR/AndroidRuntime(770):     at android.os.Looper.loop(Looper.java:132)
07-13 18:37:29.833: ERROR/AndroidRuntime(770):     at android.app.ActivityThread.main(ActivityThread.java:4025)
07-13 18:37:29.833: ERROR/AndroidRuntime(770):     at java.lang.reflect.Method.invokeNative(Native Method)
07-13 18:37:29.833: ERROR/AndroidRuntime(770):     at java.lang.reflect.Method.invoke(Method.java:491)
07-13 18:37:29.833: ERROR/AndroidRuntime(770):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
07-13 18:37:29.833: ERROR/AndroidRuntime(770):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
07-13 18:37:29.833: ERROR/AndroidRuntime(770):     at dalvik.system.NativeStart.main(Native Method)
07-13 18:37:29.833: ERROR/AndroidRuntime(770): Caused by: java.lang.NullPointerException
07-13 18:37:29.833: ERROR/AndroidRuntime(770):     at android.app.Activity.findViewById(Activity.java:1744)
07-13 18:37:29.833: ERROR/AndroidRuntime(770):     at com.Android.HelpDeskMobileApp.Main$1.<init>(Main.java:35)
07-13 18:37:29.833: ERROR/AndroidRuntime(770):     at com.Android.HelpDeskMobileApp.Main.<init>(Main.java:31)
07-13 18:37:29.833: ERROR/AndroidRuntime(770):     at java.lang.Class.newInstanceImpl(Native Method)
07-13 18:37:29.833: ERROR/AndroidRuntime(770):     at java.lang.Class.newInstance(Class.java:1301)
07-13 18:37:29.833: ERROR/AndroidRuntime(770):     at android.app.Instrumentation.newActivity(Instrumentation.java:1022)
07-13 18:37:29.833: ERROR/AndroidRuntime(770):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1663)
07-13 18:37:29.833: ERROR/AndroidRuntime(770):     ... 11 more

Ответы [ 6 ]

0 голосов
/ 13 июля 2011

У вас много проблем с тем, как ваше приложение даже запускается в своей основной деятельности!

Вам нужно установить слушателей в методе onStart (), а не в методе onCreate ().onCreate () не всегда вызывается каждый раз, когда показывается действие.

Вам не нужно выяснять, какая кнопка была нажата с помощью переключателя, если / еще, или чего-либо столь сложного ... каждыйКнопка имеет свой собственный onClickListener ().В слушателе вызовите закрытый метод для запуска нового действия.

Передайте любые данные через намерение, используя putExtra ().

Вот пример ...

public class MainActivity extends Activity {

    @Override
    public void onCreate( final Bundle savedInstanceState ) {
        super.onCreate( savedInstanceState );
        this.setContentView( R.layout.main );
    }

    @Override
    protected void onStart() {
        super.onStart();

        final Button _serviceButton = (Button)this.findViewById( R.id.buttonService );
        final Button _orderButton = (Button)this.findViewById( R.id.buttonOrder );
        final Button _progButton = (Button)this.findViewById( R.id.buttonProgramming );

        _serviceButton.setOnClickListener( new OnClickListener() {

            @Override
            public void onClick( final View v ) {
                MainActivity.this.doSomeButtonClick( "service" );
            }
        } );

        _orderButton.setOnClickListener( new OnClickListener() {

            @Override
            public void onClick( final View v ) {
                MainActivity.this.doSomeButtonClick( "order" );
            }
        } );

        _progButton.setOnClickListener( new OnClickListener() {

            @Override
            public void onClick( final View v ) {
                MainActivity.this.doSomeButtonClick( "programming" );
            }
        } );
    }

    private void doSomeButtonClick( final String type ) {
        final Intent intent = new Intent( MainActivity.this, Activity1.class );
        intent.putExtra( "serviceType", type );
        this.startActivity( intent );
    }
}
0 голосов
/ 13 июля 2011

Ошибка в строке 34

final String serviceType = i.getStringExtra("serviceType");

, что означает, что "i", вероятно, не инициализирован должным образом.

Я бы попробовал это так, чтобы контексты были правильными.

Intent i = Main.this.getIntent();

Или вы можете просто создать новое намерение, как в другом упражнении.

0 голосов
/ 13 июля 2011

Это строка 34 в Main. Строки в разделе «Причины» в выводе logcat обычно содержат соответствующую информацию.

Ладно, виновниками должны быть инициализаторы

Intent i = getIntent();
        final String serviceType = i.getStringExtra("serviceType");
        final EditText caller = (EditText) findViewById(R.id.CallerEnter), 
            callExt = (EditText) findViewById(R.id.CallNumberEnter),
            computerName = (EditText) findViewById(R.id.ComputerNameEnter),
            location = (EditText) findViewById(R.id.LocationEnter),
            request = (EditText) findViewById(R.id.RequestEnter);

происходит в конструкторе Object. Поскольку конструктор onClickListener будет запускаться до метода onCreate(), getIntent() вернет ноль, и вы не установите свой contentView, поэтому все ваши findViewById () также будут возвращать ноль.

Правильный путь будет:

private OnClickListener buttonListener = new OnClickListener() {

        ArrayList<NameValuePair> data = new ArrayList<NameValuePair>(5);

        public void onClick(View v) {
                    Intent i = getIntent();
        final String serviceType = i.getStringExtra("serviceType");
        final EditText caller = (EditText) findViewById(R.id.CallerEnter), 
            callExt = (EditText) findViewById(R.id.CallNumberEnter),
            computerName = (EditText) findViewById(R.id.ComputerNameEnter),
            location = (EditText) findViewById(R.id.LocationEnter),
            request = (EditText) findViewById(R.id.RequestEnter);

            Intent intent = new Intent(Main.this, HelpDeskEnd.class);
            final String[] email = {"target emails"};
            data.add(new BasicNameValuePair("Caller: ", textToString(caller)));
            data.add(new BasicNameValuePair("Call Ext: ", textToString(callExt)));
            data.add(new BasicNameValuePair("Computer Name: ", textToString(computerName)));
            data.add(new BasicNameValuePair("Locations: ", textToString(location)));
            data.add(new BasicNameValuePair("Request: ", textToString(request)));
            sendData(data);

            String body = data.get(0).toString() + " " + data.get(1).toString() + " " +
                    data.get(2).toString() + " " + data.get(3).toString() + " " + 
                    data.get(4).toString();
            Mail mail = new Mail("an email", "email password");
            mail.setTo(email);
            mail.setBody(body);
            mail.setFrom("an email");
            mail.setSubject(serviceType);
            try {
                mail.send();
            }
            catch (Exception e) {
                 Log.e("Send Mail", e.getMessage(), e);
            }
            intent.putExtra("serivceType", serviceType);
            startActivity(intent);
        }

    };
0 голосов
/ 13 июля 2011

Попробуйте использовать if (view == ProgramButton) else if (view == еще одна кнопка), например, вместо переключателя, вы можете опубликовать logcat и сказать, какой код (как часть прослушивателя onclick или второго действия) для нулевого указателя исключение ...

0 голосов
/ 13 июля 2011

private OnClickListener buttonListener = new OnClickListener () {

    public void onClick(View v) {
        String serviceType = null;
        Intent i = new Intent(HelpDeskFront.this, Main.class);
        switch (v.getId()) {
        case R.id.serviceButton :
            serviceType = "service";
            break;
        case R.id.OrderButton :
            serviceType = "order";
            break;
        case R.id.ProgrammingButton :
            serviceType = "programming";
            break;
        }
        i.putExtra("serviceType", serviceType);
        startActivity(i);// change this to startActivityForResult(yourintent,Intent.FILL_IN_DATA)
    }
};

Просто мысль на первый взгляд

0 голосов
/ 13 июля 2011

Решает ли HelpDeskFront.startActivity(intent); проблему?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...