在安卓系统中切换视图

3
我正在编写一个应用程序,它有一个活动可以以两种格式向最终用户提供数据:使用Teechart API提供的条形图视图(http://www.steema.com/teechart/mobile)和Android本地的listview。目前,我的一些逻辑如下:
首先,我初始化一个 boolean flag = true; 然后,我使用以下按钮逻辑在这两个视图之间进行切换。
OnClickListener changeViewListener = new OnClickListener(){

  public void onClick(View v){
    if(!flag){
       listLayout.setVisibility(View.GONE);
       chartView.setVisibility(View.VISIBLE);
       changeView.setText("List");
       flag = true;
    }else{
       listLayout.setVisibility(View.VISIBLE);
       chartView.setVisibility(View.GONE);
       changeView.setText("Graph");
       flag = false;
    }
  }
};

这段代码很好用,没有什么问题。我只是想问一下是否有更好的方式来实现它,比如使用视图翻转器(view flipper)?如果是这样的话,如何实现视图翻转器代码以在这两个视图间切换?
还是说应该为每个视图使用片段(fragments)?非常感谢您给予帮助。

教程:Android ViewFlipper的使用方法。链接:http://www.helloandroid.com/tutorials/how-use-viewflipper 和 http://www.techrepublic.com/blog/app-builder/a-dog-limps-into-a-saloon-a-tutorial-on-androids-viewflipper-widget/634。 - Houcine
如果你以前没有使用过片段并且这个应用程序没有特定的要求在平板电脑和手机上工作,那么它可以正常工作。我只需要删除标志并使用(listLayout.getVisibility()==View.VISIBLE即可。 - Budius
使用标志会消耗更多的内存吗,因为我要添加另一个变量?我希望这尽可能顺畅。 - kandroidj
我还为应用程序准备了平板电脑布局,但它们与手机布局不一致。如果我想要这个用户界面更加流畅,我应该阅读片段相关的内容吗? - kandroidj
2个回答

6
也许这篇文章对你有所帮助: 在视图之间实现动画效果 它提供了一个通用的例子,也许你可以调整它来得到你想要的翻转效果。
更新: 该教程还提供了各种动画文档的链接。从中,我认为你可以使用旋转动画来创建翻转效果。你可以给出旋转角度和围绕其旋转视图的支点。
概念是你将一个视图旋转到外面,并旋转另一个视图进入
更新:
View Flipper是实现视图之间动画的一种方法。我发布的上述方法是通用的,你可以玩弄值并创建具有更好控制性的动画。你可以创建其他人可能从未尝试过的视图之间的过渡。
View Flipper的步骤:
1. 在View Flipper中,您在Layout XML文件中定义Flipper元素。对于此flipper元素,您添加两个子元素,可以是两个视图或两个布局或一个视图和一个布局。View Flipper在您定义的这两个视图之间翻转。
2. 在XML中创建此内容后,您可以为以下类型的进入和退出转换创建四个动画规则:/res/anim
a. 左侧进入 b. 左侧退出 c. 右侧进入 d. 右侧退出
3. 在完成1和2之后,您现在在代码中添加触摸或手势侦听器,以侦听触摸和侦听事件。在这些侦听器内,您可以使用vf.setInAnimation()vf.setOutAnimation()来启动动画,其中vf是您的ViewFlipper实例。
你可以在这里找到完整的代码:
1. View Flipper教程1 2. View Flipper教程2

更新: 要使View Flipper与ListView配合工作,需要进行一些微调。我在另一个SO问题中找到了同样的问题,并通过进行小修改解决了它。点击这里查看。


这也是ViewFlipper的工作原理吗?如果我只是在我的两个布局中添加动画,似乎可以在不必改变很多代码的情况下获得这种效果。 - kandroidj
我已更新我的答案,解释了View Flipper并提供了两个带有完整代码示例的教程链接。还解释了View Flipper和一般动画之间的区别。 - sanjeev mk
如果我使用这个方法,由于两个视图都是可滚动的,那么就无法翻转视图了?我该如何在ListView上实现ViewFlipper? - kandroidj
另一个SO问题解决了相同的问题。我已经在更新的答案中发布了链接。看看它是否解决了你的问题。 - sanjeev mk

1

如果您只有两个视图需要在之间切换,那么这种方法已经足够好了。但是,您可以使用一个视图翻页器来实现此功能。如果您有多个视图,则这种方法尤其有用,因为它不会一次性渲染所有视图并浪费内存。ViewPager将管理何时创建和销毁视图。

  1. 在布局中定义

    <android.support.v4.view.ViewPager
     android:id="@+id/viewPager"
     android:layout_width="match_parent"
     android:layout_height="match_parent" />
    
  2. 创建适配器

    class MyPagerAdapter extends PagerAdapter {
    
        public int getCount() {
            return 2;
        }
    
        public Object instantiateItem(View collection, int position) {
            LayoutInflater inflater = (LayoutInflater) collection.getContext().getSystemService(
                    Context.LAYOUT_INFLATER_SERVICE);
    
            // 根据位置填充正确的视图
            View view = inflater.inflate(R.layout.yourLayoutHere, null);
    
            // ... 设置视图
    
            ((ViewPager) collection).addView(view, 0);
            return view;
        }
    
        @Override
        public void destroyItem(View arg0, int arg1, Object arg2) {
            ((ViewPager) arg0).removeView((View) arg2);
        }
    
        @Override
        public boolean isViewFromObject(View arg0, Object arg1) {
            return arg0 == ((View) arg1);
        }
    
        @Override
        public Parcelable saveState() {
            return null;
        }
    }
    
  3. 设置适配器

    ViewPager viewPager = findViewById(R.id.viewPager);
    viewPager.setAdapter(new MyPagerAdapter());
    
现在,您可以在按钮点击时设置视图页面的当前项目。
    viewPager.setCurrentItem(position);

谢谢你的回答。如果这是一个足够好的方法,我将保持不变,并添加动画,使其看起来像视图在翻转进出。因为只有两个视图,所以不会浪费太多内存,因为数据是从本地数据库中获取的。如果我的需求发生变化,比如使用HTTPTransportSE访问Web服务之类的,我会重新考虑改变我的方法。再次感谢。 - kandroidj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接