0

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

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

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

是否可以在不创建新活动并将新意图传递给它并且当然对android清单文件进行相关更改的情况下做到这一点?

以黑莓功能为例 - android 中是否有与黑莓的推送和弹出屏幕等效的功能?屏幕在哪里推动/弹出,只会扩展 MainScreen?

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

4

4 回答 4

3

相当于 BB 的推送/弹出屏幕的 Android 是startActivity()/ finish()ViewSwitcher但是,您可以通过使用容器视图(如@hasanghaforian 建议的那样)或setContentView()在想要更改屏幕时简单地调用新的视图层次结构,在单个活动中管理自己的视图。请注意,当您调用 时setContentView,您通过调用获得的任何视图引用都findViewById将是陈旧的。

于 2012-09-03T21:41:24.327 回答
0

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

于 2012-09-03T21:38:25.143 回答
0

如果你提到在同一个活动中是否可以有不同的布局,答案是肯定的。

活动独立于布局,您无需在清单中为活动分配布局,您可以定义活动中使用的布局,从 Activity 类调用 setContentView() 方法来设置布局。

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

如果您不能通过xml静态创建布局,您可以根据需要在每次需要时通过代码动态创建它。

另外你可以有一堆布局,每次你需要一个新的屏幕,构建它,将它压入堆栈并调用 setContentView() 方法,当你不再需要它时,弹出堆栈并调用 setContentView( ) 与堆栈顶部的新布局。

希望对你有帮助

于 2012-09-03T22:40:15.337 回答
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();
}
于 2012-09-03T23:03:41.730 回答