Androidアクティビティを実行できません

DevWithSigns

Android Lollipop(5.0)用のアプリを作成しようとしています。ログインフラグメントがあり、ログインボタンを押すとアプリが自動的にクラッシュします。コードを共有しています。エラーメッセージを教えてください。

BaseActivity.java

public abstract class BaseActivity extends AppCompatActivity {
    protected CoreApplication coreApplication;
    @Override
    protected void onCreate(Bundle savedState) {
        super.onCreate(savedState);
        coreApplication = (CoreApplication) getApplication();
    }
}

BaseAuthenticatedActivity.java

public abstract class BaseAuthenticatedActivity extends BaseActivity {
    @Override
    protected final void onCreate(Bundle savedState) {
        super.onCreate(savedState);
        if (!coreApplication.getAuth().getUser().isLoggedIn()) {
            startActivity(new Intent(this, LoginActivity.class));
            finish();
            return;
        }
        onCoreApplicationCreate(savedState);
    }
    protected abstract void onCoreApplicationCreate(Bundle savedState);
}

LoginActivity.java

public class LoginActivity extends BaseActivity implements View.OnClickListener, LoginFragment.CallBacks {
    private static final int REQUEST_NARROW_LOGIN = 1;
    private View loginButton;
    @Override
    protected void onCreate(Bundle savedState) {
        super.onCreate(savedState);
        setContentView(R.layout.activity_login);
        loginButton = findViewById(R.id.LoginJustChat);
        if (loginButton != null) {
            loginButton.setOnClickListener(this);
        }
    }
    @Override
    public void onClick(View view) {
        if (view == loginButton)
            startActivityForResult(new Intent(this, LoginNarrowActivity.class), REQUEST_NARROW_LOGIN);
    }
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (resultCode != RESULT_OK)
            return;
        if (requestCode == REQUEST_NARROW_LOGIN) {
            finishLogin();
        }
    }
    private void finishLogin() {
        startActivity(new Intent(this, MainActivity.class));
        finish();
    }
    @Override
    public void onLoggedIn() {
        finishLogin();
    }
}

LoginNarrowActivity.java

public class LoginNarrowActivity extends BaseActivity implements LoginFragment.CallBacks {
    @Override
    protected void onCreate(Bundle savedState){
        super.onCreate(savedState);
        setContentView(R.layout.activity_login_narrow);
    }
    @Override
    public void onLoggedIn() {
        setResult(RESULT_OK);
        finish();
    }
}

MainActivity.java

public class MainActivity extends BaseAuthenticatedActivity {
    @Override
    protected void onCoreApplicationCreate(Bundle savedState) {
    }
}

BaseFragment.java

public abstract class BaseFragment extends Fragment {
    protected CoreApplication application;
    @Override
    public void onCreate(Bundle savedInstance) {
        super.onCreate(savedInstance);
        application = (CoreApplication) getActivity().getApplication();
    }
}

LoginFragment.java

public class LoginFragment extends BaseFragment implements View.OnClickListener {

    private Button loginButton;
    private CallBacks callBacks;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup root, Bundle savedState) {
        View view = inflater.inflate(R.layout.fragment_login, root, false);
        loginButton = (Button) view.findViewById(R.id.fragment_login_loginButton);
        loginButton.setOnClickListener(this);
        return view;
    }
    @Override
    public void onClick(View view) {
        if (view == loginButton) {
            application.getAuth().getUser().setIsLoggedIn(true);
            callBacks.onLoggedIn();

        }
    }
    // because onAttach(Activity activity) is deprecated
    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        if (context instanceof CallBacks) {
            callBacks = (CallBacks) context;
        } else {
            throw new ClassCastException(context.toString()
                    + " must implement MyListFragment.OnItemSelectedListener");
        }
    }
    @Override
    public void onDetach() {
        super.onDetach();
        callBacks = null;
    }

    public interface CallBacks {
        void onLoggedIn();
    }
}

エラー:

java.lang.NullPointerException:nullオブジェクト参照でインターフェイスメソッド 'void com.example.usama.demoapp.fragments.LoginFragment $ CallBacks.onLoggedIn()'を呼び出そうとしました

これで案内してください。

フロガット

Androidへようこそ!

あなたはNullPointerExceptionそれは非常に一般的です[そして素敵です。デバッグするのはかなり簡単なので] Javaの例外。を確認してくださいLoginFragment次の方法では、この例外が発生します。

@Override
public void onClick(View view) {
    if (view == loginButton) {
        application.getAuth().getUser().setIsLoggedIn(true);
        callBacks.onLoggedIn();
    }
}

このエラーを診断するためのいくつかの注意事項:

  • クラスメンバーを初期化して宣言すると、この場合callBacks、Javaは自動的にに初期化しnullます。

  • null参照に対して任意のメソッドを呼び出すと、になりNPEます。

さて、あなたの特定のケースに絞り込みましょう。呼び出されたクラスメンバーを宣言しましたcallBacksが、初期化したことはありません。また、何かを割り当てるメソッドが表示されません。したがって、そのクラスメンバーは常に残りnull、それによって、その後のメソッド呼び出しはになりますNPE

解決策として、LoginFragmentそれを設定するクラスにsetterメソッドを追加する必要がありますcallBacks反対側では、このフラグメントのインスタンスを最初に作成する場所にこのオブジェクトを指定します。

アップデート#1

onAttachメソッドのパラメーターとしてContextではなくActivityを渡すと、機能します。しかし、なぜそれがエラーを引き起こしているのか知りたいですか?

理由は簡単です。あなたのアクティビティはすでにそのインターフェースを実装しているので、それをLoginFragmentコンテキストとしてあなたに渡すと、条件if (context instanceof CallBacks)が真になります。ただし、裸で合格contextしても、そのif声明は成立しません

セッターを定義する方法を教えてください。

とても簡単です!他の通常のメソッドと同様に、次のようなメソッドを宣言します。

public void setOnLoginListener(Callbacks listener){
    this.callbacks = listener;
}

アップデート#2

ここで、setOnLoginListenerメソッドを定義する必要があります

内部LoginFragmentクラス。

どこに呼べばいいの?

LoginFragmentクラスを最初にインスタンス化するメインアクティビティ

どのパラメータで?

そのJavaインターフェースを実装するアクティビティ。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

実行時例外がアクティビティを開始できません

分類Dev

Android java.lang.IllegalStateException:アクティビティのメソッドを実行できませんでした

分類Dev

Android-IllegalStateException:アクティビティのメソッドを実行できませんでした

分類Dev

Androidはアクティビティのメソッドを実行できませんでした

分類Dev

Android-アクティビティのメソッドを実行できませんでした

分類Dev

Androidアクティビティを開始できません

分類Dev

アクティビティAndroidを開始できません

分類Dev

アプリの実行時に「アクティビティをインスタンス化できません」

分類Dev

アクティビティのメソッドを実行できませんでした:AutoCompleteTextView.setAdapter

分類Dev

アクティビティのメソッドを実行できませんでしたか?

分類Dev

InvocationTargetException:アクティビティのメソッドを実行できませんでした

分類Dev

アクティビティandroidNougat7.xでLocalDateTimeのインスタンスを実行できません。

分類Dev

実行時に Android アクティビティを設定できますか?

分類Dev

onPostExecuteから新しいアクティビティを実行できません

分類Dev

AndroidアクティビティでAdMob広告を表示できません

分類Dev

Androidでアクティビティを開始できません

分類Dev

Androidでアクティビティ例外を一時停止できません

分類Dev

Androidのアクティビティで音量を制御できません

分類Dev

Android Studio でアクティビティを追加できません

分類Dev

AndroidStudioでアクティビティを追加できません

分類Dev

Androidエラー:アクティビティを再開できません..?

分類Dev

Android:java.lang.NullPointerExceptionアクティビティを開始できません

分類Dev

Android:アクティビティを開始できません:NullPointerException?

分類Dev

アクティビティを終了できません

分類Dev

アクティビティを開始できませんAndroidStudio

分類Dev

アクティビティを開始できません-YouTubeStandalonePlayer

分類Dev

NullPointerException。アクティビティを作成できません

分類Dev

EventBusアクティビティを開始できません

分類Dev

Android KotlinRoomリポジトリが詳細アクティビティ内から行を取得できません

Related 関連記事

  1. 1

    実行時例外がアクティビティを開始できません

  2. 2

    Android java.lang.IllegalStateException:アクティビティのメソッドを実行できませんでした

  3. 3

    Android-IllegalStateException:アクティビティのメソッドを実行できませんでした

  4. 4

    Androidはアクティビティのメソッドを実行できませんでした

  5. 5

    Android-アクティビティのメソッドを実行できませんでした

  6. 6

    Androidアクティビティを開始できません

  7. 7

    アクティビティAndroidを開始できません

  8. 8

    アプリの実行時に「アクティビティをインスタンス化できません」

  9. 9

    アクティビティのメソッドを実行できませんでした:AutoCompleteTextView.setAdapter

  10. 10

    アクティビティのメソッドを実行できませんでしたか?

  11. 11

    InvocationTargetException:アクティビティのメソッドを実行できませんでした

  12. 12

    アクティビティandroidNougat7.xでLocalDateTimeのインスタンスを実行できません。

  13. 13

    実行時に Android アクティビティを設定できますか?

  14. 14

    onPostExecuteから新しいアクティビティを実行できません

  15. 15

    AndroidアクティビティでAdMob広告を表示できません

  16. 16

    Androidでアクティビティを開始できません

  17. 17

    Androidでアクティビティ例外を一時停止できません

  18. 18

    Androidのアクティビティで音量を制御できません

  19. 19

    Android Studio でアクティビティを追加できません

  20. 20

    AndroidStudioでアクティビティを追加できません

  21. 21

    Androidエラー:アクティビティを再開できません..?

  22. 22

    Android:java.lang.NullPointerExceptionアクティビティを開始できません

  23. 23

    Android:アクティビティを開始できません:NullPointerException?

  24. 24

    アクティビティを終了できません

  25. 25

    アクティビティを開始できませんAndroidStudio

  26. 26

    アクティビティを開始できません-YouTubeStandalonePlayer

  27. 27

    NullPointerException。アクティビティを作成できません

  28. 28

    EventBusアクティビティを開始できません

  29. 29

    Android KotlinRoomリポジトリが詳細アクティビティ内から行を取得できません

ホットタグ

アーカイブ