Приложение вылетает после реализации onClickListener

1

Я только что реализовал onClickListener. Приложение должно переключаться между двумя макетами. На каждом макете есть одна кнопка. После касания кнопки макет должен измениться.

Я искал различные учебники и документальные фильмы, мой код должен быть правильным, я просто не вижу ошибки. Eclipse также говорит, что код в порядке.

    package ralationship.v1;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class RelationshipActivity extends Activity implements OnClickListener{
    /** Called when the activity is first created. */
    private Button OptionsButton;
    private Button SaveButton;

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

        SaveButton = (Button)findViewById(R.id.btnSave);
        OptionsButton = (Button)findViewById(R.id.btnOptions);
        OptionsButton.setOnClickListener(this);
        SaveButton.setOnClickListener(this);

    }

    public void onClick(View v) {
        if(v.getId() == (R.id.btnOptions)){
            setContentView(R.layout.options);
        }else if (v.getId() == (R.id.btnSave)){
            setContentView(R.layout.main);
        }

    }

}

Кто-нибудь находит ошибку?

//РЕДАКТИРОВАТЬ:

Вот отчет LogCat:

01-26 15:47:29.273: D/dalvikvm(336): GC_EXTERNAL_ALLOC freed 49K, 53% free 2549K/5379K, external 1625K/2137K, paused 67ms
01-26 15:47:29.453: D/AndroidRuntime(336): Shutting down VM
01-26 15:47:29.462: W/dalvikvm(336): threadid=1: thread exiting with uncaught exception (group=0x40015560)
01-26 15:47:29.473: E/AndroidRuntime(336): FATAL EXCEPTION: main
01-26 15:47:29.473: E/AndroidRuntime(336): java.lang.RuntimeException: Unable to start activity ComponentInfo{ralationship.v1/ralationship.v1.RelationshipActivity}: java.lang.NullPointerException
01-26 15:47:29.473: E/AndroidRuntime(336):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647)
01-26 15:47:29.473: E/AndroidRuntime(336):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
01-26 15:47:29.473: E/AndroidRuntime(336):  at android.app.ActivityThread.access$1500(ActivityThread.java:117)
01-26 15:47:29.473: E/AndroidRuntime(336):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
01-26 15:47:29.473: E/AndroidRuntime(336):  at android.os.Handler.dispatchMessage(Handler.java:99)
01-26 15:47:29.473: E/AndroidRuntime(336):  at android.os.Looper.loop(Looper.java:123)
01-26 15:47:29.473: E/AndroidRuntime(336):  at android.app.ActivityThread.main(ActivityThread.java:3683)
01-26 15:47:29.473: E/AndroidRuntime(336):  at java.lang.reflect.Method.invokeNative(Native Method)
01-26 15:47:29.473: E/AndroidRuntime(336):  at java.lang.reflect.Method.invoke(Method.java:507)
01-26 15:47:29.473: E/AndroidRuntime(336):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
01-26 15:47:29.473: E/AndroidRuntime(336):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
01-26 15:47:29.473: E/AndroidRuntime(336):  at dalvik.system.NativeStart.main(Native Method)
01-26 15:47:29.473: E/AndroidRuntime(336): Caused by: java.lang.NullPointerException
01-26 15:47:29.473: E/AndroidRuntime(336):  at ralationship.v1.RelationshipActivity.onCreate(RelationshipActivity.java:22)
01-26 15:47:29.473: E/AndroidRuntime(336):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
01-26 15:47:29.473: E/AndroidRuntime(336):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
01-26 15:47:29.473: E/AndroidRuntime(336):  ... 11 more
01-26 15:47:33.633: I/Process(336): Sending signal. PID: 336 SIG: 9
  • 0
    сообщение об ошибке из logcat.
  • 0
    @ Кевин, опубликуй отчет.
Теги:
button
onclick

2 ответа

1
Лучший ответ

Я предполагаю, что ваш файл saveButton находится в макете R.layout.options? Если это так, он недоступен для R.layout.main когда ваша деятельность сначала создается, поскольку у вас есть только контент из R.layout.main. Вместо этого вы должны положить строки

SaveButton = (Button)findViewById(R.id.btnSave);
SaveButton.setOnClickListener(this);

внутри onClickListener, после того как вы изменили макет с помощью setContentLayout() на правильный макет.

  • 0
    это сработало для меня, большое спасибо
1

если кнопка опций находится в параметрах xml, чем вам нужно раздувать это вручную. Когда вы вызываете setContentView и назначаете макет xml, вы можете автоматически раздуваться от того, что находится на этом конкретном xml. Если вам нужно надуть что-нибудь еще, вам нужно использовать layoutInflater context.getSystemService(context.layoutInflaterservice)

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню