0

我的应用程序有屏幕,只有一个活动。我的主要活动是这样的:我有调用屏幕的方法,我没有使用活动(我在某处读到使用更复杂。)所以我使用了方法,但是有一个问题。

当我打开活动时,登录屏幕会正常

当我单击 loginBtn 时,listScreen 来

但是,当我单击 listScreen 中的后退按钮返回 loginScreen 时,应用程序正在关闭并打开模拟器的主屏幕。

一般;

loginScreen --> loginBtn --> listScreen --> listBtn --> writeScreen

我想要的是用模拟器上的“后退”按钮回到这条路上。我不想通过覆盖后退按钮来做到这一点,因为这样我只能在方法中设置一件事。

public class EmailActivity extends Activity 
{
public void onCreate(Bundle savedInstanceState) 
        {
        super.onCreate(savedInstanceState);
        // setContentView(R.layout.main);
        loginScreen();
    }

public void loginScreen() 
{
        this.setContentView(R.layout.main);
                Button loginBtn = (Button) findViewById(R.id.btnLogin);

        loginBtn.setOnClickListener(new Button.OnClickListener() {

            @Override
            public void onClick(View v) 
                        {
                listScreen();
            }

        });
}

public void listScreen()
{
            this.setContentView(R.layout.list);
                Button listBtn = (Button) findViewById(R.id.btnList);

        listBtn.setOnClickListener(new Button.OnClickListener() {

            @Override
            public void onClick(View v) 
                        {
                setContentView(R.layout.writeScreen);
            }

        });

}
4

3 回答 3

2

因为您必须为应用程序中使用的每个屏幕编写一个 Activity...您只是在调用方法,而在内存中您只有一个 Activity,因此,后退按钮会弹出 Activity 并返回主页...阅读以下内容: http://developer.android.com/guide/topics/fundamentals/tasks-and-back-stack.html

如果你想调用另一个屏幕(Activity)m,你创建一个 Intent 实例,它告诉系统“嘿!,调用我在这里传递的东西”,例如,你有两个活动,称为 A1 和 A2,如果你想从 A1 调用 A2,你必须这样做:

Intent intent = new Intent(A1.this,A2.class);
startActivity(intent);

它会将 A2 推到 A1 上,所以当你按回时,你会得到 A1

于 2012-04-17T18:59:47.570 回答
1

要返回上一个屏幕,您将需要使用不同的活动。现在您只有一个活动,当您按下后退按钮时,您的应用程序将关闭该活动,因此您的整个应用程序将关闭。

如果您仍然想这样做,您可以覆盖硬件返回按钮以调用上述方法而不是关闭应用程序。

于 2012-04-17T19:02:04.737 回答
1

要直接回答您的问题,实现您所要求的唯一方法是覆盖后退按钮。后退按钮默认关闭当前活动并返回到上一个活动。在您的情况下,您只有一项活动,因此您的应用程序将关闭。覆盖后退按钮很容易,您仍然可以控制您的“视图”。

您可以使用活动类中的几个类级别字段(私有变量)来跟踪您的位置,例如

private int currentView;
private int lastView;
private static enum Views {LoginScreen, ListScreen}

...
...

public void loginScreen() 
{

    lastView = currentView;
    currentView = Views.LoginScreen;

    this.setContentView(R.layout.main);
            Button loginBtn = (Button) findViewById(R.id.btnLogin);

    loginBtn.setOnClickListener(new Button.OnClickListener() {

        @Override
        public void onClick(View v) 
                    {
            listScreen();
        }

    });
}

public void listScreen()
{

    lastView = currentView;
    currentView = Views.ListScreen;

    this.setContentView(R.layout.list);
    Button listBtn = (Button) findViewById(R.id.btnList);

    listBtn.setOnClickListener(new Button.OnClickListener() {

        @Override
        public void onClick(View v) 
                    {
            setContentView(R.layout.writeScreen);
        }

    });

}

但是,您确实这样做是错误的,尤其是如果您想学习如何编写 Android 应用程序并可能在应用程序商店上发布一些应用程序。

活动更复杂,但有充分的理由,一旦你学会了基础知识,你就永远不会回头。我真的建议您为每个屏幕创建一个活动。你必须做更多的工作,但是你最终会更好地控制你的应用程序的行为方式和更好、更易于维护的代码。
从这里开始

如果您的目标是 HC 及以上,您可能还想查看 Fragments:

碎片

去吧。你不会后悔的!

于 2012-04-17T19:13:41.713 回答