【问题标题】:navigating between simple activities在简单活动之间导航
【发布时间】:2013-12-14 04:20:28
【问题描述】:

你好

我想知道这个概念在android中是如何实现的

  • 此应用程序中的导航如下所示::

活动1--到--->活动2--到--。>活动3--到--> 活动2

但是这样做 ::

我传递的数据来自

Activity1 - -> Activity 2- -> 我没有从Activity2传递数据 - - > 活动3

现在

如果我导航回 Activity2- - 从 - - Activity3

  • 应用程序关闭,因为 Activity2 正在等待数据 Activity3 中不存在
  • 我怎样才能克服这个问题,我怎样才能保存状态(甚至数据) 从 Activity3 导航回来之前的活动 2

循环必须是 ::

活动1--到--->活动2--到--。>活动3--到--> 活动2


  • 如何做到这一点?
  • 我需要寻找哪些概念

我希望我的描述很清楚


我提供了一个示例程序来支持我的问题

如何修改代码来实现这一点

MainActivity.java

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity1);

        Button BTN=(Button) findViewById(R.id.activity3button3);
        BTN.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
        Intent INT=new Intent(MainActivity.this,Activity2.class);
                INT.putExtra("hi", "HI");
                startActivity(INT);     
            }
        }); 
    }

 }

Activity2.java

public class Activity2 extends Activity{

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity2);



        Button BTN=(Button) findViewById(R.id.activity3button3);

        BTN.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub

                Intent INT=new Intent(Activity2.this,Activity3.class);
                startActivity(INT);

            }
        });

    }



}

Activity3.java

public class Activity3 extends Activity{

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity3);

        Button BTN=(Button) findViewById(R.id.activity3button3);

        BTN.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                Intent INT=new Intent(Activity3.this,Activity2.class);
                startActivity(INT);
            }
        });



    }



}

【问题讨论】:

  • 您是否有理由在单个活动中使用多个活动而不是多个片段?

标签: android


【解决方案1】:

您可以使用的选项很少。

方法一:

在 Activty 2 中,您可以使用 onSaveInstanceIndtance() 保存一些数据。 这个函数只是在 onDestroy 之前调用。在 onCreate() 你可以 使用 onRetroreInstanceState() 检索保存的数据

方法二:

您可以将数据保存在 sharedPreferences 中。在任何活动的任何时候 您可以获取保存在 sharedPreference 中的数据。

方法三:

您可以使用“singleTask”标志开始您的活动2。所以来的时候 从活动 3 回到活动 2,之前的实例将被调用 从堆栈。在这种情况下,不会为 Activtiy 2 调用 onCreate()。 而是会调用 onNewIntent()。

您可以根据需要使用其中之一。

【讨论】:

  • 看起来我们有5个解决方案,然后:)
  • 其实有很多方法可以解决这个问题。可能在您的情况下,您可以为活动 2 设置标志“singleTask”。这将是最容易做到的:)
【解决方案2】:

也许这会有所帮助

您有 R.layout.activity1R.layout.activity2R.layout.activity3,因为您需要为所有人提供单独的按钮,但您已将 R.id.activity3button3 提供为一个按钮,因此更好地为三个活动创建三个按钮

Button BTN=(Button) findViewById(R.id.activity1button1);
        BTN.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {

                     Intent ide = new Intent(MainActivity.this,Activity2.class);
                     ide .putExtra("hi", "HI");
                 ide.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                     startActivity(ide);
            }
        }); 



  Button BTN=(Button) findViewById(R.id.activity2butto2);
            BTN.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {

                         Intent ide = new Intent(Acitvity2.this,Acitvity3.class);
                         ide .putExtra("hi", "HI");
                         ide.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                         startActivity(ide);
                }
            }); 

Button BTN=(Button) findViewById(R.id.activity3button3);
        BTN.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {

                     Intent ide = new Intent(Acitvity3.this,Acitvity2.class);
                     ide .putExtra("hi", "HI");
                 ide.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                     startActivity(ide);
            }
        }); 

【讨论】:

  • @ Hari ...我正在寻找一个答案,例如 sushil 在其中一个答案中给出的答案 .... 使用代码示例将有所帮助 ...您可以根据该答案更新您的答案
【解决方案3】:

方案一是保持传递值:

Intent INT=new Intent(Activity2.this,Activity3.class);
INT.putExtra("hi", getIntent().getStringExtra("hi","error");
startActivity(INT);

一次又一次

Intent INT=new Intent(Activity3.this,Activity2.class);
INT.putExtra("hi", getIntent().getStringExtra("hi","error");
startActivity(INT);

解决方案 2 是创建一个静态变量,该变量将保存值并且可以跨应用程序访问。

public class DataHolder {
    public static String hi;
}

在 Activity2 中,不是从 Bundle 中获取值,而是从 DataHolder 中获取:

String hi = DataHolder.hi;

这是我首先想到的两件事。

【讨论】:

  • 你的第一个解决方案是非常好的想法......感谢分享信息:)
  • 谢谢。但要小心,因为它可能会很乱。您还应该考虑 @Sushil 的第 3 个解决方案并设置 launchMode = "singleTask"。如果它适合你,它是最优雅的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-21
相关资源
最近更新 更多