2

皆さんと共有したい問題がいくつかあります。

すべてのファイルは GITHUB にあります

最初の 1 つは、タイトルにあるエラーに関するものです。とをFirstRun.java:82指すalert.show();FirstRun.java:63alertDialog.show();

私が観察している動作は次のとおりです。

  1. 最初の alertDialog が数秒間表示されます
  2. アプリケーションが終了します (強制終了ではありません)。
  3. アプリの再起動を開始すると、空白の画面が表示され (次の問題を参照)、2 番目のアクティビティが実行されていることを意味します。SharedPrefs を使用して、1 つのアクティビティを起動する必要があるかどうかを確認しています。

完全な logcat:

    32444-32444/carpedujourproductions.quickpronote E/WindowManager: Activity carpedujourproductions.quickpronote.FirstRun has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView{967f7300 V.E..... R.....ID 0,0-729,594} that was originally added here
            android.view.WindowLeaked: Activity carpedujourproductions.quickpronote.FirstRun has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView{967f7300 V.E..... R.....ID 0,0-729,594} that was originally added here
            at android.view.ViewRootImpl.<init>(ViewRootImpl.java:345)
            at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:239)
            at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69)
            at android.app.Dialog.show(Dialog.java:281)
            at carpedujourproductions.quickpronote.FirstRun.onCreate(FirstRun.java:63)
            at android.app.Activity.performCreate(Activity.java:5207)
            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2195)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2281)
            at android.app.ActivityThread.access$600(ActivityThread.java:148)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1263)
            at android.os.Handler.dispatchMessage(Handler.java:99)
            at android.os.Looper.loop(Looper.java:137)
            at android.app.ActivityThread.main(ActivityThread.java:5124)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:525)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
            at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:110)
            at dalvik.system.NativeStart.main(Native Method)  

32444-32444/carpedujourproductions.quickpronote E/WindowManager: Activity carpedujourproductions.quickpronote.FirstRun has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView{968738b8 V.E..... R......D 0,0-729,585} that was originally added here
            android.view.WindowLeaked: Activity carpedujourproductions.quickpronote.FirstRun has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView{968738b8 V.E..... R......D 0,0-729,585} that was originally added here
            at android.view.ViewRootImpl.<init>(ViewRootImpl.java:345)
            at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:239)
            at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69)
            at android.app.Dialog.show(Dialog.java:281)
            at android.app.AlertDialog$Builder.show(AlertDialog.java:951)
            at carpedujourproductions.quickpronote.FirstRun.onCreate(FirstRun.java:82)
            at android.app.Activity.performCreate(Activity.java:5207)
            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2195)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2281)
            at android.app.ActivityThread.access$600(ActivityThread.java:148)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1263)
            at android.os.Handler.dispatchMessage(Handler.java:99)
            at android.os.Looper.loop(Looper.java:137)
            at android.app.ActivityThread.main(ActivityThread.java:5124)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:525)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
            at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:110)
            at dalvik.system.NativeStart.main(Native Method)

別物:

SharedPrefs が奇妙なことをしています。アプリを初めて起動した後、設定が保存されたように見え、(空ではない) ファイルが存在します/data/data/carpedujourproductions.quickpronote/shared_prefs/ が、ルート ファイル エクスプローラー (ES; Solid) では読み取ることができません。


最後に:

条件を処理するのに少し問題があります。私の を見るとMainActivity.java、Android Studio は文字列を教えてくれますurlt&url決して使用されません。ファイルに表示されている順序に従うようにするにはどうすればよいでしょうか? (読み取りetab_sel--> 値を決定して書き込みますurlt--> 読み取りuser_is--> 値を決定して書き込みます-->変数の 1 つとしてurlJS コードを実行します。url

これらのいずれかについて回答を提供できる人には、BIG BIG に感謝します。この3つは何らかの形で関連している可能性があります。

4

2 に答える 2

4

問題は、で使用している 2 つのスピナーに起因しますFirstRun.java

スピナー、スピナー2

また、内部のコードonItemSelected()が意図したとおりかどうかもわかりません。

@Override
public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
    switch (parent.getId()) {
    case R.id.spinner:
        etab_sel = parent.getItemAtPosition(pos).toString();
        Spinner2.setVisibility(View.VISIBLE);
    case R.id.spinner2:
        user_is = parent.getItemAtPosition(pos).toString();
        onStop();
    }
}

現在、アイテムが Spinner で選択されてcase R.id.spinner起動されると、フォール スルーが発生し、内部のステートメントcase R.id.spinner2も実行され、結果として が呼び出されるためonStop()です。

これは意図した動作ですか?break;それとも、ステートメントを配置するのを忘れましたか?

また、 ではonStop()、 を呼び出しますfinish()。現時点では と が表示されているため、次のメッセージが表示されますalertDialogdialog

Activity carpedujourproductions.quickpronote.FirstRun has leaked window

Activity carpedujourproductions.quickpronote.FirstRun has leaked window

さて、さらに悪いことに:

onItemSelected()a が初期化されるときに呼び出されSpinnerます。

したがって、初期化するとすぐにR.id.spinner > onItemSelected()呼び出され ます> ケースR.id.spinner > フォールスルー > onStop() > editor.putBoolean("IsInitialized", true); > finish(); while alertDialogand alertare shown > リークされたウィンドウ

そして、あなたが呼び出すので:

editor.putBoolean("IsInitialized", true);

ではonStop()FirstRun以降のアプリの起動時に開始されることはありません。

(MainActivity.java から)

boolean IsInitialized = settings.getBoolean("IsInitialized", false);

if (IsInitialized == false) {
    Intent intent = new Intent(MainActivity.this, FirstRun.class);
    startActivity(intent);
    finish();
}

ご覧のとおり、ここでの修正は 1 つだけではありません。のロジックの側面を再考する必要がありFirstRunます。ユーザーが最初の起動時にスピナーからデータを選択しない場合に設定IsInitializedする必要がありますか?true

例外を取り除くには (今のところ)、次の手順を実行します。

// Declare two global boolean variables
boolean justStarted_1 = true;
boolean justStarted_2 = true;

....
....

@Override
public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {

    // Spinner is set; Ignore
    if (justStarted_1) {

        justStarted_1 = false;

    // Spinner2 is set; ignore
    } else if (justStarted_2) {

        justStarted_2 = false;

    // finally: here
    } else {
        switch (parent.getId()) {
        case R.id.spinner:
            etab_sel = parent.getItemAtPosition(pos).toString();
            Spinner2.setVisibility(View.VISIBLE);
            break;
        case R.id.spinner2:
            user_is = parent.getItemAtPosition(pos).toString();
            onStop();
            break;
        }
    }
}

もう 1 つ: を表示するには、アプリをアンインストールし続ける必要がありますFirstRun。当面の簡単な修正は、次を使用することです。

editor.putBoolean("IsInitialized", false);

での作業を終了しFirstRun、 に置き換えfalsetrue、別のことをしてください!

于 2013-09-02T00:49:51.740 に答える
2

あなたのコードから、同じアクティビティのコンテキストを渡すダイアログからのアクティビティを終了していることがわかります。あなたのダイアログは、終了したアクティビティを参照しています。

AlertDialog alertDialog = new AlertDialog.Builder(MainActivity.this).create();
        alertDialog.setTitle("Remise \u00e0 z\u00e9ro");
        alertDialog.setMessage("Voulez-vous effacer tous vos param\u00e8tres (Identifiant, Mot de passe, type d\'accès de votre appareil?");
        alertDialog.setButton("Oui", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {

                SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
                SharedPreferences.Editor editor = settings.edit();
                editor.putBoolean("IsInitialized", false);
                editor.putString("etab", "");
                editor.putString("name", "");
                editor.putString("key", "");
                editor.putString("manurl", manurl);
                editor.putString("user_is", "");
                editor.commit();
                finish();

            }
        });
        alertDialog.setButton("Non", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialogInterface, int i) {
            }
        });
于 2013-08-30T14:58:24.193 に答える