質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.48%

  • Java

    16121questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • Android

    7386questions

    Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

  • Android Studio

    4356questions

    Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

  • Realm

    262questions

    RealmとはSQLiteやCore Dataに代わるモバイルデータベースです。iOSとAndroidの両方でサポートされています。

データベース(Realm)で、削除時に”本当に削除しますか?"と聞き”YES/NO”を選択できるようにしたい

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,114

sakanasann

score 3

書籍のサンプルソースを改造しようとしています。
書籍のサンプルソースでは削除ボタンを押すとそのまま削除されてしまい、誤操作の危険性があるためタイトルのような処理を追加したいと思い、別のサンプルを改良したものを作成しそれと組み合わせようと考えました。
しかし、どう組み合わせれば正常に動くかわからずいろいろと試してみたのですが一向に正常に動きません。
もちろん、それぞれ単独では正常に動作します。
本来ならば時間をかけて勉強しエラーの対処にあたりたいのですが、諸事情によりあまり時間をとれなくなってしまったため、質問することとしました。
おそらくは、かなり初歩的なミスも多いのかと思われますがよろしくお願いします。

開発環境はAndroidStudioです。
Java言語での開発、Androidstudioの利用、Realmの利用は今回が初めてです。
エラー文の意味はおおざっぱには理解できたのですが、それをどうすれば解決できるのかがわかりません。

なお、teratailの利用も今回が初めてですので、その点についても気になるところがありましたらご指摘くださるとありがたいです。

↓書籍の削除処理部分のソースコード
ScheduleEditActivityクラス内に記述されています

public void onDeleteTapped(View view) {
        long scheduleId = getIntent().getLongExtra("schedule_id", -1);
        if (scheduleId != -1) {
            Realm realm = Realm.getInstance(this);
            RealmResults<Schedule> results = realm.where(Schedule.class)
                    .equalTo("id", scheduleId).findAll();
            realm.beginTransaction();
            results.remove(0);
            realm.commitTransaction();
            Toast.makeText(this, "削除しました", Toast.LENGTH_SHORT).show();
        }
        finish();
    }

↓サンプルソースをもとに改良したソースコード
YESボタンを押すと”削除しました”と表示
NOボタンを押すと”キャンセルしました”と表示
この時点では上下のソースのものとは別のプロジェクトです。
MainActivityクラス内に記述しています

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        AlertDialog.Builder alert = new AlertDialog.Builder(this);
        alert.setMessage("本当に削除しますか?");
        alert.setPositiveButton("No", new DialogInterface.OnClickListener(){
            public void onClick(DialogInterface dialog, int which) {
                //Noボタンが押された時の処理
                Toast.makeText(MainActivity.this, "キャンセルしました", Toast.LENGTH_LONG).show();
            }});
        alert.setNegativeButton("Yes", new DialogInterface.OnClickListener(){
            public void onClick(DialogInterface dialog, int which) {
                //Yesボタンが押された時の処理
                Toast.makeText(MainActivity.this, "削除しました", Toast.LENGTH_LONG).show();
            }});
        alert.show();
    }

この2つを組み合わせて、削除時に”本当に削除しますか?”と聞き、YESを押せば削除する。NOを押せばキャンセルするようにしたいです。

↓自分で試してみた結果、エラーが出ました。
先ほどの「書籍の削除処理部分のソースコード」に「サンプルソースをもとに改良したソースコード 」を書き加える形になっています
ScheduleEditActivityクラス内に記述しています

public void onDeleteTapped(View view) {
        super.onCreate(savedInstanceState);
        AlertDialog.Builder alert = new AlertDialog.Builder(this);
        alert.setMessage("本当に削除しますか?");
        alert.setPositiveButton("No", new DialogInterface.OnClickListener(){
            public void onClick(DialogInterface dialog, int which) {
                //Noボタンが押された時の処理
                Toast.makeText(MainActivity.this, "キャンセルしました", Toast.LENGTH_LONG).show();
            }});
        alert.setNegativeButton("Yes", new DialogInterface.OnClickListener(){
            public void onClick(DialogInterface dialog, int which) {
                //Yesボタンが押された時の処理
                long scheduleId = getIntent().getLongExtra("schedule_id", -1);
                if (scheduleId != -1) {
                    Realm realm = Realm.getInstance(this);
                    RealmResults<Schedule> results = realm.where(Schedule.class)
                            .equalTo("id", scheduleId).findAll();
                    realm.beginTransaction();
                    results.remove(0);
                    realm.commitTransaction();
                    Toast.makeText(this, "削除しました", Toast.LENGTH_SHORT).show();
                }
            }});
        alert.show();
        finish();
    }

エラー文は以下の通りです。

Error:(99, 24) エラー: シンボルを見つけられません
シンボル:   変数 savedInstanceState
場所: クラス ScheduleEditActivity

Error:(105, 44) エラー: MainActivityは内部クラスを囲みません

Error:(112, 40) エラー: getInstanceに適切なメソッドが見つかりません(<anonymous OnClickListener>)
メソッド Realm.getInstance(Context)は使用できません
(引数の不一致: <anonymous OnClickListener>をContextに変換できません:)
メソッド Realm.getInstance(RealmConfiguration)は使用できません
(引数の不一致: <anonymous OnClickListener>をRealmConfigurationに変換できません:)

どうすればよいでしょうか?

-----追記-----
↓指摘部分と、その他一部を修正しました。
変更部分:
・「super.onCreate(savedInstanceState);」を削除     
・「this」を「getBaseContext()」に変更
・「Toast.makeText(MainActivity.this, "キャンセルしました", Toast.LENGTH_LONG).show();」を
「Toast.makeText(getBaseContext(), "キャンセルしました", Toast.LENGTH_LONG).show();」に変更

public void onDeleteTapped(View view) {
        AlertDialog.Builder alert = new AlertDialog.Builder(this);
        alert.setMessage("本当に削除しますか?");
        alert.setPositiveButton("No", new DialogInterface.OnClickListener(){
            public void onClick(DialogInterface dialog, int which) {
                //Noボタンが押された時の処理
                Toast.makeText(getBaseContext(), "キャンセルしました", Toast.LENGTH_LONG).show();
            }});
        alert.setNegativeButton("Yes", new DialogInterface.OnClickListener(){
            public void onClick(DialogInterface dialog, int which) {
                //Yesボタンが押された時の処理
                long scheduleId = getIntent().getLongExtra("schedule_id", -1);
                if (scheduleId != -1) {
                    Realm realm = Realm.getInstance(getBaseContext());
                    RealmResults<Schedule> results = realm.where(Schedule.class)
                            .equalTo("id", scheduleId).findAll();
                    realm.beginTransaction();
                    results.remove(0);
                    realm.commitTransaction();
                    Toast.makeText(getBaseContext(), "削除しました", Toast.LENGTH_SHORT).show();
                }
            }});
        alert.show();
        finish();
    }

エラーはでなくなったものの、AlertDialog画面が表示後すぐに閉じてしまうようになりました。
削除処理はされておらず、トーストも表示されていません。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

super.onCreate(savedInstanceState);

は不要です。これは、参考になさった onCreate 独自のものなので onDeleteTapped で呼び出すことは出来ません。

あと、Realmを操作するところですが、それ自体をMainActivity内のローカルな関数にしておき、それを呼び出すようにしてみたらどうでしょうか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/09/30 10:28

    指摘部分とその他一部を修正しました。
    「this」を「getBaseContext()」に変更するとエラーが消えたという記事を見つけ試してみたところ、エラーは消えたもののYES/NOの選択をする前に閉じてしまうようになりました。
    削除処理はされておらず、トーストも表示されていません。


    まずは現状で正常に動作させたいので、ローカルな関数にするかどうかは後程決めたいと思います。

    キャンセル

  • 2016/09/30 10:43

    thisが何を指すかということですね。ローカルな関数にするということは、thisはMainActivityを指すはず。しかし、AlertDialogの中に書いてしまうとthisはAlertDialogを指すことになります。
    中に書く場合は、getBaseContext()ではなくgetActivity()でないといけないじゃないかな?

    キャンセル

  • 2016/10/01 17:45

    ありがとうございました!

    キャンセル

同じタグがついた質問を見る

  • Java

    16121questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • Android

    7386questions

    Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

  • Android Studio

    4356questions

    Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

  • Realm

    262questions

    RealmとはSQLiteやCore Dataに代わるモバイルデータベースです。iOSとAndroidの両方でサポートされています。

  • トップ
  • Javaに関する質問
  • データベース(Realm)で、削除時に”本当に削除しますか?"と聞き”YES/NO”を選択できるようにしたい