是否可以创建多个屏幕,Android应用程序中只有一个Activity?

时间:2012-09-03 21:29:36

标签: android blackberry dynamic stack screen

通常情况下,我会使用不同的XML文件为我希望显示的每个“屏幕”使用单独的活动。

但是我正在使用动态加载jar文件到android应用程序中,因此在运行时,我不知道会有多少活动,或者会有多少个屏幕。

目前,使用java反射,我能够从动态加载的java文件中返回一个字符串列表,并将每个列表项作为一个单独的按钮绘制到屏幕上。如果单击其中一个按钮,我希望能够在堆栈上加载不同的“屏幕”。因此,当我从这个新屏幕按回来时,它会转到上一个调用它的屏幕。

是否可以在不创建新活动并向其传递新意图的情况下执行此操作,当然还可以对android清单文件进行相关更改?

使用黑莓功能作为一个例子 - 在黑莓的推送和弹出屏幕中是否有与Android相同的功能?屏幕推送/弹出的地方,只会扩展到MainScreen?

如果有人有疑问,或者如果我一直含糊不清,请发表评论,我会尽力解释自己,非常感谢任何帮助。

4 个答案:

答案 0 :(得分:3)

与BB的推/弹屏相当的Android是startActivity() / finish()。但是,您可以通过使用容器视图(例如ViewSwitcher,如@hasanghaforian建议)或通过简单地使用新视图层次结构调用setContentView()来管理您自己的单个活动中的视图。改变屏幕。请注意,当您致电setContentView时,通过调用findViewById获得的任何视图引用都将过时。

答案 1 :(得分:0)

您可以使用ViewSwitcher。 ViewSwitcher是一个ViewAnimator,在两个视图之间切换,并有一个工厂,可以从中创建这些视图。您可以使用工厂创建视图,也可以自己添加它们。 ViewSwitcher只能有两个子视图,其中一次只显示一个。您可以使用fragments

答案 2 :(得分:0)

如果您参考同一活动中是否可以有不同的布局,答案是肯定的。

活动与布局无关,您不为清单中的活动分配布局,您可以在Activity中调用setContentView()方法的活动中定义要使用的布局来设置布局。

因此,如果您想要一些布局(屏幕),您唯一需要做的就是定义各种布局并在需要调用setContentView(R.layout.the布局)时使用它们,在此调用之后,所选择的布局将显示。

如果您无法通过xml静态创建布局,则可以根据需要随时根据需要通过代码创建它。

此外,您可以拥有一堆布局,每次需要一个新屏幕,构建它,将其推送到堆栈并调用setContentView()方法,当您不需要它时,弹出堆栈并使用堆栈顶部的新布局调用setContentView()。

希望对你有帮助

答案 3 :(得分:0)

在我看来你应该使用Fragment。我假设你有一些代码片段,你迭代字符串:

for(String def : definitions) {
   Fragment f = new CustomFragment();
   Bundle b = new Bundle();
   b.putString("STRING_DEF",def);
   f.setArguments(b);
   fragments.add(f);
}

在上面的代码中,只创建了Framents的集合。我们来看看CustomFragment实现:

CustomFragment extends Fragment {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
        Bundle savedInstanceState) {
        String def = getArguments.getString("STRING_DEF");
        //write code to create view
        return view;
    }
}

现在在你的ListActivity中你必须像这样或多或少地实现点击监听器

public void onListItemClick(ListView l, View v, int position, long id) {
    FragmentManager fragMgr = getFragmentManager();
    FragmentTransaction t = fragMgr.beginTransaction();
    t.replace(R.id.id_of_view_place_holder_for_fragment, 
        fragments.get(position),"FRAGMENT_TAG");
    t.commit();
}