Android 在按下警报对话框中的按钮之前,是否可以继续创建?

Android 在按下警报对话框中的按钮之前,是否可以继续创建?,android,android-studio,android-fragments,Android,Android Studio,Android Fragments,我几乎完成了我的应用程序的第1版,正在对它进行最后的润色。然而,在用户可以继续使用应用程序之前,我需要一个对话框让用户接受EULA 我将alertdialogue调用放在OnCreate方法中。当应用程序第一次打开或更新时,它们会显示一个带有接受拒绝按钮的模式警报框,这非常有效。如果点击“拒绝”,应用程序将关闭;如果点击“接受”,对话框将被取消,并显示已开始的活动 我要做的是在oncreate中显示警报框,然后在按下ACCEPT或CANCEL按钮之前不加载任何其他内容 我是否使用停止和恢复?我迷

我几乎完成了我的应用程序的第1版,正在对它进行最后的润色。然而,在用户可以继续使用应用程序之前,我需要一个对话框让用户接受EULA

我将alertdialogue调用放在OnCreate方法中。当应用程序第一次打开或更新时,它们会显示一个带有接受拒绝按钮的模式警报框,这非常有效。如果点击“拒绝”,应用程序将关闭;如果点击“接受”,对话框将被取消,并显示已开始的活动

我要做的是在oncreate中显示警报框,然后在按下ACCEPT或CANCEL按钮之前不加载任何其他内容

我是否使用停止和恢复?我迷路了


肖恩·穆利根(Shawn Mulligan)

你几乎说对了,唯一缺少的是: 1在首选项中添加用户选择,以便在用户选择接受的情况下,不会反复显示对话框。
2具有If条件,在该条件下,如果用户未接受条款和条件,则根据偏好再次显示对话框或调用触发导航的所需方法,API等。这也是用户第一次从警报对话框的回调中选择一个肯定选项调用所需的方法。您可以在onCreate中尝试此操作

case R.id.dialog_button_accept:// ACCEPT 
    setContentView(R.layout.activity_main);
    // do other things
    break;
case R.id.dialog_button_cancel:// CANCEL 
    finish();// finish this activity
    break;

我有一个单独的类用于显示Eula以及生成和存储密钥。下面是该类中“正”和“负”按钮的代码:

 @Override
                        public void onClick(DialogInterface dialogInterface, int i) {
                            // Mark this version as read.
                            SharedPreferences.Editor editor = prefs.edit();
                            editor.putBoolean(eulaKey, true);
                            editor.commit();
                            dialogInterface.dismiss();

                        }
                    })
                    .setNegativeButton(android.R.string.cancel, new Dialog.OnClickListener() {

                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            // Close the activity as they have declined the EULA
                            mActivity.finish();
                        }

                    });
下面是activity main OnCreate方法的代码

super.onCreate(savedInstanceState);
                new SimpleEula(this).show();
                setContentView(R.layout.activity_main);

                //loading the default fragment
                loadFragment(new HomeFragment());
@Override
        protected void onCreate(Bundle savedInstanceState) {

                super.onCreate(savedInstanceState);
                new SimpleEula(this).show();


                setContentView(R.layout.activity_main);

                //loading the default fragment
                loadFragment(new HomeFragment());
                //getting bottom navigation view and attaching the listener

                BottomNavigationView navigation = findViewById(R.id.navigation);
                navigation.setOnNavigationItemSelectedListener(this);

        }

总体目标是显示EULA并暂停onCreate的其余部分,直到在显示EULA时做出决定。那么,使用发布的解决方案,有没有办法恢复并保存积极按钮,然后将其传递回OnCreate,然后使用上面发布的解决方案中的switch语句?

因此,我能够成功地编辑所有代码,当我启动它时,它只是从黑变白。不知道我做错了什么

清单文件我想问题可能就在那里

<activity android:name=".ShowEula">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
一如既往

new SimpleEula(this).show();
假设是加载检查和/或显示Eula。然后启动startActivity以加载原始MainActivity

最终结果是一个闪烁的黑白屏幕应用程序

不太清楚我哪里出错了。

SimpleEula.Java

package com.app.restaurant.bowzers;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.preference.PreferenceManager;
import android.view.View;

import static android.support.v4.content.ContextCompat.getSystemServiceName;
import static android.support.v4.content.ContextCompat.startActivity;


public class SimpleEula {

    private String EULA_PREFIX = "eula_";
    private Activity mActivity;





    public SimpleEula(Activity context) {
        mActivity = context;
    }

    private PackageInfo getPackageInfo() {
        PackageInfo pi = null;
        try {
            pi = mActivity.getPackageManager().getPackageInfo(mActivity.getPackageName(), PackageManager.GET_ACTIVITIES);
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }
        return pi;
    }

    public void show() {
        PackageInfo versionInfo = getPackageInfo();

        // the eulaKey changes every time you increment the version number in the AndroidManifest.xml
        final String eulaKey = EULA_PREFIX + versionInfo.versionCode;
        final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(mActivity);
        boolean hasBeenShown = prefs.getBoolean(eulaKey, false);
        if(hasBeenShown == false){

            // Show the Eula
            String title = mActivity.getString(R.string.app_name) + " v" + versionInfo.versionName;

            //Includes the updates as well so users know what changed.
            String message = mActivity.getString(R.string.updates) + "\n\n" + mActivity.getString(R.string.eula);

            AlertDialog.Builder builder = new AlertDialog.Builder(mActivity)
                    .setTitle(title)
                    .setMessage(message)
                    .setCancelable(false)
                    .setPositiveButton(android.R.string.ok, new Dialog.OnClickListener() {

                        @Override
                        public void onClick(DialogInterface dialogInterface, int i) {
                            // Mark this version as read.
                            SharedPreferences.Editor editor = prefs.edit();
                            editor.putBoolean(eulaKey, true);
                            editor.commit();
                            dialogInterface.dismiss();

                                               }
                    })
                    .setNegativeButton(android.R.string.cancel, new Dialog.OnClickListener() {

                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            // Close the activity as they have declined the EULA
                            mActivity.finish();
                        }

                    });
            builder.create().show();
        }
    }

}
Manifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.app.restaurant.bowzers">

    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.CALL_PHONE" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme"
        android:usesCleartextTraffic="true">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>


        <!--Maps Api Key-->
        <meta-data android:name="com.google.android.geo.API_KEY" android:value="API_KEY_FOR_MAPS"/>
    </application>
    <uses-feature
        android:required="true"
        android:glEsVersion="0x00020000"/>

</manifest>

总体目标是在他们同意EULA之前停止加载所有内容。正如代码所示,这确实不是一个大问题,但它确实困扰着我,EULA确实加载了,但在模态对话框后面加载了初始片段,而不是白色背景,没有任何内容,也没有底部导航。

我遗漏了这一部分,因为我认为它无关紧要,但是我让它写入一个基于版本生成的共享密钥,这样一旦用户接受EULA,它将再次显示的唯一时间就是他们下载更新。这听起来非常合乎逻辑,但是我从另一个类打开了EULA对话框,并将其保存在自己的文件中,该文件是从OnCreate方法调用的。因此,我可以将setContentView放在该类文件的accept部分,而不是调用Eula后的onCreate中吗?在onClick方法中尝试此mActivity.setContentViewR.layout.activity_main为什么不将Eula作为启动程序活动并检查保存的密钥,如果用户接受了这一点,那么将其导航到主要活动。因此,我查看了它,并尝试在不必重写整个blasten的情况下使用代码,但似乎无法确定我需要做什么才能使其正常工作。我所做的,到目前为止没有得到任何结果,是创建了一个新的类ShowEula,然后在onCreate方法中,将代码从MainActivity转移到Load ShowEula;一切都很好,很美好,直到结束当前的活动,开始新的活动。StartTactivity没有被识别,还有一些我尝试过的东西。更不用说更改清单文件了。到底发生了什么@ShwanI更新了上面的新代码,我得到的只是一个黑白闪烁的屏幕。所以我只是做了另一个测试,并注释掉了启动新意图的两行代码。意图intent2=新意图showEULA.this,MainActivity.class;startactivityinent2;EULA显示为接受和取消按钮。那么,我的两行代码启动新活动有什么问题呢?@war\u Herotry setContent并在活动中显示xml没有完整的信息,很难提供帮助,日志中是否有任何错误?我不明白为什么在激活积极和/或消极侦听器之前,应用程序仍在加载或试图加载MainActivity?您是否可以在samme activity中创建警报对话框?哦,这很简单,您在这一行之后开始活动new SimpleUlaThis.show;
@Override
        protected void onCreate(Bundle savedInstanceState) {

                super.onCreate(savedInstanceState);
                new SimpleEula(this).show();


                setContentView(R.layout.activity_main);

                //loading the default fragment
                loadFragment(new HomeFragment());
                //getting bottom navigation view and attaching the listener

                BottomNavigationView navigation = findViewById(R.id.navigation);
                navigation.setOnNavigationItemSelectedListener(this);

        }