【问题标题】:Help with order of events in Android app loading page帮助 Android 应用加载页面中的事件顺序
【发布时间】:2011-06-09 16:34:18
【问题描述】:

我正在学习 Android(具有讽刺意味的是,来自 Google 和 SO 的开发者网站的交叉),但我在早期步骤中遇到了麻烦。我要参加的活动顺序是: 1.加载启动页面 2. 5秒后(这是暂时的……最终会被用来掩盖加载时间),切换到主视图 3. 在主视图加载时,弹出一个 nag 窗口(当前为 alertDialog),为用户提供两个按钮按下选项

除了一个问题外,我所有这些都正常工作。当启动页面出现时(应用程序启动时),nag 窗口会立即弹出。您可以在 nag 窗口下方看到启动页面运行良好,它会等待 5 秒,然后切换到主页面。有人可以告诉我我做错了什么,就试图让 nag 窗口在启动页面计数完成之前不弹出?主java页面粘贴在下面:

public class MyProject extends Activity {

    protected Dialog mSplashDialog;
    private static final int NAG_BOX = 0;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        MyStateSaver data = (MyStateSaver) getLastNonConfigurationInstance();
        if (data != null) {
            // Show splash screen if still loading
            if (data.showSplashScreen) {
                showSplashScreen();
            }
            setContentView(R.layout.main);    
            showDialog(NAG_BOX);

            // Rebuild your UI with your saved state here
        } else {
            showSplashScreen();
            setContentView(R.layout.main);
            // Do your heavy loading here

        }
    }

    @Override
    public Object onRetainNonConfigurationInstance() {
        MyStateSaver data = new MyStateSaver();
        // Save your important data here

        if (mSplashDialog != null) {
            data.showSplashScreen = true;
            removeSplashScreen();
        }
        return data;
    }

    /**
     * Removes the Dialog that displays the splash screen
     */
    protected void removeSplashScreen() {
        if (mSplashDialog != null) {
            mSplashDialog.dismiss();
            mSplashDialog = null;
        }
    }

    /**
     * Shows the splash screen over the full Activity
     */
    protected void showSplashScreen() {
        mSplashDialog = new Dialog(this, R.style.SplashScreen);
        mSplashDialog.setContentView(R.layout.splash);
        mSplashDialog.setCancelable(false);
        mSplashDialog.show();

        // Set Runnable to remove splash screen just in case
        final Handler handler = new Handler();
        handler.postDelayed(new Runnable() {
          @Override
          public void run() {
            removeSplashScreen();
          }
        }, 5000);
    }

    /**
     * Simple class for storing important data across config changes
     */
    private class MyStateSaver {
        public boolean showSplashScreen = false;
        // Your other important fields here
    }

     @Override
        protected Dialog onCreateDialog(int id) {
            switch (id) {

            case NAG_BOX:
                // This example shows how to add a custom layout to an AlertDialog
                LayoutInflater factory = LayoutInflater.from(this);
                final View textEntryView = factory.inflate(R.layout.nagbox, null);
                return new AlertDialog.Builder(MyProject.this)
                    .setView(textEntryView)
                    .setNegativeButton("Maybe Later", new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int whichButton) {
                           dismissDialog(NAG_BOX);
                        }
                    })
                    .setPositiveButton("Go To Site", new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int whichButton) {

                            Uri url = Uri.parse("http://www.google.com");
                            Intent intent = new Intent(Intent.ACTION_VIEW, url);
                            startActivity(intent);
                        }
                    })

                    .create();
            }
            return null;
        }
}

【问题讨论】:

    标签: java android user-interface mobile


    【解决方案1】:

    为什么不在您关闭初始屏幕后调用 showDialog(NAG_BOX)?

    protected void removeSplashScreen() {
        if (mSplashDialog != null) {
            mSplashDialog.dismiss();
            mSplashDialog = null;
            showDialog(NAG_BOX);
        }
    }
    

    【讨论】:

    • 请随意制作为已接受 :)。虽然我必须同意其他 cmets,因为有更清洁的方法来完成你所追求的。
    • 非常感谢您的快速帮助。我希望有一种方法可以像在 Experts-Exchange 上那样分配积分。你们看起来都很有知识,我会使用我在这里得到的所有信息。
    • 这让他立即克服了困难,但并没有以可接受的方式解决问题。强烈建议不要将任何长时间运行的进程放在 UI 线程上,它们专门为这些类型的操作提供 AsyncTask。尽管如此,您的代码确实/将起作用。
    • 对不起,如果我在宣传任何不正确的行为。我习惯了 EE,您可以根据相关性接受多个答案和分点。对我来说学习经验。感谢所有做出贡献的人。
    • cagreenanswer 正是我所说的。然而它们都有效,我们都被否决了?
    【解决方案2】:
    if (data != null) {
        // Show splash screen if still loading
        if (data.showSplashScreen) {
            showSplashScreen();
        }
        setContentView(R.layout.main);    
        showDialog(NAG_BOX);
    

    在您的代码的这一部分中,您的嵌套 if 虽然显示了您的启动画面,但并不意味着它不会显示 NAG_BOX

    您需要一个在 showDialog(NAG_BOX) 周围的条件,它在 showSplashSreen() 函数之后调用

    【讨论】:

      【解决方案3】:

      首选方法是使用 AsyncTask 进行长操作。您可以使用 publishProgress() 方法更新初始屏幕以指示进度。这也将为您的虚假等待时间创建一个很好的存根点。

      然后在 AsyncTask 的 onPostExecute() 中你可以显示你的对话框。

      http://developer.android.com/reference/android/os/AsyncTask.html

      【讨论】:

      • 我肯定会在接下来的步骤中考虑到这一点,因为它可能是比我目前更好的方法。我接受了另一个答案,因为它只是让我到达了我需要更快的地方,我想你不能在这个网站上接受多个答案,而且我没有足够的声誉来投票给答案。我非常感谢您的意见,这将有助于大时间
      猜你喜欢
      • 2012-03-10
      • 1970-01-01
      • 2018-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-24
      相关资源
      最近更新 更多