Android之fragment点击切换和滑动切换结合

学了一小段时间的Android,主要接触的是UI设计,打交道最多莫过于fragment了吧。在Android3.0引入了fragment的概念后,几乎在所以的Android的应用中都可以看见其身影,已经有很多前辈高人都已经详细介绍过fragmrnt,我这里就不多说什么了。

这里本来是想模仿一下微信的切换效果,怎奈水平不足,这里就献丑贴出半成品的代码,希望有大神能指点一下。废话不多说,上代码。先从简单的开始吧,这里是我一共用了3个fragment,这里就只贴出第一个的fragment的布局,别的两个基本一样,比较简朴。

<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    android:gravity="center_horizontal|center_vertical"
     xmlns:android="http://schemas.android.com/apk/res/android">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="This the first fragment"
        />
</LinearLayout>

接下来的是使用fragment片段,这里也只贴出第一个的。

package com.example.fragments;

import com.example.viewfragtext.R;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class Fragmentone extends Fragment
{
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        return inflater.inflate(R.layout.fragment1, container, false);
    }
}

接下来便要开始实现切换的功能,这里是底部切换组件(tabfoot)的布局。

<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="44dp"
    android:orientation="horizontal"
    android:background="@drawable/tabfootbg"
    xmlns:android="http://schemas.android.com/apk/res/android">
    <LinearLayout
         android:id="@+id/lay1"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
         android:layout_weight="1"
         style="@style/Linearlayout_Style"
        >
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/fratext1"
            android:text="@string/chat"
            android:textColor="@color/black"
            />
    </LinearLayout>
    <LinearLayout
         android:id="@+id/lay2"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
         android:layout_weight="1"
         style="@style/Linearlayout_Style">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/fratext2"
            android:text="@string/find"
            android:textColor="@color/black"/>
    </LinearLayout>
    <LinearLayout
         android:id="@+id/lay3"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
         android:layout_weight="1"
         style="@style/Linearlayout_Style">
         <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/fratext3"
            android:text="@string/tongxunlu"
            android:textColor="@color/black"/>
     </LinearLayout>
</LinearLayout>

这里分别是自定义的style和color的代码。

<style name="Linearlayout_Style">
        <item name="android:orientation">vertical</item>
        <item name="android:gravity">center</item>
        <item name="android:clickable">true</item>
        <item name="android:onClick">LayoutOnclick</item>
 </style>

<?xml version="1.0" encoding="UTF-8"?>
<resources >
    <color name="lightseagreen">#20b2aa</color><!--亮海蓝色 -->
    <color name="black">#000000</color><!-- 黑色 -->

</resources>

别的设计都完成了,马上对应的是MainActivity的设计,这是其布局

<LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    xmlns:android="http://schemas.android.com/apk/res/android">

    <fragment
        android:name="com.example.fragments.Fragmentone"
        android:id="@+id/fragment1"
        android:layout_height="0dp"
        android:layout_weight="1.0"
        android:layout_width="fill_parent"
        />
     <fragment
        android:name="com.example.fragments.Fragmenttwo"
        android:id="@+id/fragment2"
        android:layout_height="0dp"
        android:layout_weight="1.0"
        android:layout_width="fill_parent"
        />
         <fragment
        android:name="com.example.fragments.Fragmentthree"
        android:id="@+id/fragment3"
        android:layout_height="0dp"
        android:layout_weight="1.0"
        android:layout_width="fill_parent"

        />

    <include layout="@layout/tabfoot"/>

</LinearLayout>

最后遍是实现在主活动中实现点击底部切换和滑动的换的功能。这里滑动功能我是采用手势(Gesture)实现的。

  1 package com.example.viewfragtext;
  2
  3 import android.os.Bundle;
  4 import android.support.v4.app.Fragment;
  5 import android.support.v4.app.FragmentActivity;
  6 import android.view.GestureDetector;
  7 import android.view.GestureDetector.OnGestureListener;
  8 import android.view.Menu;
  9 import android.view.MotionEvent;
 10 import android.view.View;
 11 import android.widget.LinearLayout;
 12 import android.widget.TextView;
 13
 14 public class MainActivity extends FragmentActivity implements OnGestureListener
 15 {
 16     public static Fragment[] fragments;
 17     public static LinearLayout[] linearLayouts;
 18     public static TextView[] textViews;
 19     /**定义手势检测实例*/
 20     public static GestureDetector detector;
 21     /**做标签,记录当前是哪个fragment*/
 22     public int MARK=0;
 23     /**定义手势两点之间的最小距离*/
 24     final int DISTANT=50;
 25
 26
 27     @Override
 28     protected void onCreate(Bundle savedInstanceState) {
 29         super.onCreate(savedInstanceState);
 30         setContentView(R.layout.activity_main);
 31         //分别实例化和初始化fragement、lineatlayout、textview
 32         setfragment();
 33         setlinearLayouts();
 34         settextview();
 35         //创建手势检测器
 36         detector=new GestureDetector(this);
 37
 38     }
 39
 40     @Override
 41     public boolean onCreateOptionsMenu(Menu menu) {
 42         // Inflate the menu; this adds items to the action bar if it is present.
 43         getMenuInflater().inflate(R.menu.main, menu);
 44         return true;
 45     }
 46     /**初始化fragment*/
 47     public void setfragment()
 48     {
 49         fragments=new Fragment[3];
 50         fragments[0]=getSupportFragmentManager().findFragmentById(R.id.fragment1);
 51         fragments[1]=getSupportFragmentManager().findFragmentById(R.id.fragment2);
 52         fragments[2]=getSupportFragmentManager().findFragmentById(R.id.fragment3);
 53         getSupportFragmentManager().beginTransaction().hide(fragments[0]).hide(fragments[1]).hide(fragments[2])
 54         .show(fragments[0]).commit();
 55
 56     }
 57      /**初始化linerlayout*/
 58     public void setlinearLayouts()
 59     {
 60         linearLayouts=new LinearLayout[3];
 61         linearLayouts[0]=(LinearLayout)findViewById(R.id.lay1);
 62         linearLayouts[1]=(LinearLayout)findViewById(R.id.lay2);
 63         linearLayouts[2]=(LinearLayout)findViewById(R.id.lay3);
 64         linearLayouts[0].setBackgroundResource(R.drawable.lay_select_bg);
 65     }
 66      /**初始化textview*/
 67     public void settextview()
 68     {
 69         textViews=new TextView[3];
 70         textViews[0]=(TextView)findViewById(R.id.fratext1);
 71         textViews[1]=(TextView)findViewById(R.id.fratext2);
 72         textViews[2]=(TextView)findViewById(R.id.fratext3);
 73         textViews[0].setTextColor(getResources().getColor(R.color.lightseagreen));
 74     }
 75     /**点击底部linerlayout实现切换fragment的效果*/
 76     public void LayoutOnclick(View v)
 77     {
 78         resetlaybg();//每次点击都重置linearLayouts的背景、textViews字体颜色
 79         switch (v.getId()) {
 80         case R.id.lay1:
 81              getSupportFragmentManager().beginTransaction().hide(fragments[0]).hide(fragments[1]).hide(fragments[2])
 82                 .show(fragments[0]).commit();
 83             linearLayouts[0].setBackgroundResource(R.drawable.lay_select_bg);
 84             textViews[0].setTextColor(getResources().getColor(R.color.lightseagreen));
 85             MARK=0;
 86             break;
 87
 88         case R.id.lay2:
 89             getSupportFragmentManager().beginTransaction().hide(fragments[0]).hide(fragments[1]).hide(fragments[2])
 90             .show(fragments[1]).commit();
 91             linearLayouts[1].setBackgroundResource(R.drawable.lay_select_bg);
 92             textViews[1].setTextColor(getResources().getColor(R.color.lightseagreen));
 93             MARK=1;
 94             break;
 95         case R.id.lay3:
 96             getSupportFragmentManager().beginTransaction().hide(fragments[0]).hide(fragments[1]).hide(fragments[2])
 97             .show(fragments[2]).commit();
 98             linearLayouts[2].setBackgroundResource(R.drawable.lay_select_bg);
 99             textViews[2].setTextColor(getResources().getColor(R.color.lightseagreen));
100             MARK=2;
101         break;
102         default:
103             break;
104         }
105     }
106     /**重置linearLayouts、textViews*/
107     public void resetlaybg()
108     {
109         for(int i=0;i<3;i++)
110         {
111             linearLayouts[i].setBackgroundResource(R.drawable.tabfootbg);
112             textViews[i].setTextColor(getResources().getColor(R.color.black));
113         }
114
115     }
116
117     @Override
118     public boolean onTouchEvent(MotionEvent event) {
119         // TODO Auto-generated method stub
120         //将该Activity上触碰事件交给GestureDetector处理
121         return detector.onTouchEvent(event);
122     }
123     @Override
124     public boolean onDown(MotionEvent arg0) {
125         // TODO Auto-generated method stub
126         return false;
127     }
128
129     /**滑动切换效果的实现*/
130     @Override
131     public boolean onFling(MotionEvent arg0, MotionEvent arg1, float arg2,
132             float arg3) {
133         // TODO Auto-generated method stub
134         resetlaybg();
135         //当是Fragment0的时候
136         if(MARK==0)
137         {
138             if(arg1.getX()>arg0.getX()+DISTANT)
139             {
140                 getSupportFragmentManager().beginTransaction().hide(fragments[0]).hide(fragments[1]).hide(fragments[2])
141                 .show(fragments[1]).commit();
142                 linearLayouts[1].setBackgroundResource(R.drawable.lay_select_bg);
143                 textViews[1].setTextColor(getResources().getColor(R.color.lightseagreen));
144                 MARK=1;
145             }
146             else
147             {
148                 linearLayouts[0].setBackgroundResource(R.drawable.lay_select_bg);
149                 textViews[0].setTextColor(getResources().getColor(R.color.black));
150             }
151
152         }
153         //当是Fragment1的时候
154         else if (MARK==1)
155         {
156             if(arg1.getX()>arg0.getX()+DISTANT)
157             {
158                 getSupportFragmentManager().beginTransaction().hide(fragments[0]).hide(fragments[1]).hide(fragments[2])
159                 .show(fragments[2]).commit();
160                 linearLayouts[2].setBackgroundResource(R.drawable.lay_select_bg);
161                 textViews[2].setTextColor(getResources().getColor(R.color.lightseagreen));
162                 MARK=2;
163             }
164             else if(arg0.getX()>arg1.getX()+DISTANT)
165             {
166                 getSupportFragmentManager().beginTransaction().hide(fragments[0]).hide(fragments[1]).hide(fragments[2])
167                 .show(fragments[0]).commit();
168                 linearLayouts[0].setBackgroundResource(R.drawable.lay_select_bg);
169                 textViews[0].setTextColor(getResources().getColor(R.color.lightseagreen));
170                 MARK=0;
171             }
172             else
173             {
174               linearLayouts[1].setBackgroundResource(R.drawable.lay_select_bg);
175                 textViews[1].setTextColor(getResources().getColor(R.color.black));
176             }
177         }
178         //当是Fragment2的时候
179         else if(MARK==2)
180         {
181             if(arg0.getX()>arg1.getX()+DISTANT)
182             {
183              getSupportFragmentManager().beginTransaction().hide(fragments[0]).hide(fragments[1]).hide(fragments[2])
184              .show(fragments[1]).commit();
185              linearLayouts[1].setBackgroundResource(R.drawable.lay_select_bg);
186                 textViews[1].setTextColor(getResources().getColor(R.color.lightseagreen));
187              MARK=1;
188             }
189             else
190             {
191              linearLayouts[2].setBackgroundResource(R.drawable.lay_select_bg);
192                 textViews[2].setTextColor(getResources().getColor(R.color.black));
193             }
194         }
195         return false;
196     }
197
198     @Override
199     public void onLongPress(MotionEvent arg0) {
200         // TODO Auto-generated method stub
201
202     }
203
204     @Override
205     public boolean onScroll(MotionEvent arg0, MotionEvent arg1, float arg2,
206             float arg3) {
207         // TODO Auto-generated method stub
208         return false;
209     }
210
211     @Override
212     public void onShowPress(MotionEvent arg0) {
213         // TODO Auto-generated method stub
214
215     }
216
217     @Override
218     public boolean onSingleTapUp(MotionEvent arg0) {
219         // TODO Auto-generated method stub
220         return false;
221     }
222
223 }

最后的效果图

转载请注明出处:http://www.cnblogs.com/zhrxidian/p/3801545.html

Android之fragment点击切换和滑动切换结合

时间: 2024-10-10 03:13:23

Android之fragment点击切换和滑动切换结合的相关文章

Android典型界面设计——ViewPage+Fragment实现区域顶部tab滑动切换

一.问题描述 本系列将结合案例应用,陆续向大家介绍一些Android典型界面的设计,首先说说tab导航,导航分为一层和两层(底部区块+区域内头部导航),主要实现方案有RadioGroup+ViewPage+Fragment.Viewpager Indicator.ActionBar Tabs.FragmentTabHost+Fragment等,下面我们先采用RadioGroup+ViewPage+Fragment实现区域头部导航. 如图所示: 二.案例主要组件 1.先看一下MainActivit

使用TabLayout、ViewPager和Fragment实现顶部菜单可滑动切换

效果图如下 首先,要使用控件需要添加design library,在Android Studio中添加 compile 'com.android.support:design:23.4.0' 然后是布局文件 <?xml version="1.0" encoding="utf-8"?>   <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android&qu

Android Studio之多个Activity的滑动切换(二)

1.因为Android界面上的全部控件一般都位于Layout控件(比方RelativeLayout)之上,而布局控件能够设置响应touch事件,所以能够通过布局控件的setOnTouchListen来截获touch事件.做进一步的处理. 2.关于界面滑动.涉及到gesture的处理,而gesture(手势)是touch事件的更高一层的事件,能够将touch事件传入GestureDetector对象进行处理,而创建GestureDetector对象,要首先创建OnGestureListener对象

Android防微信首页左右滑动切换

大家看到微信首页切换效果有没有觉得很炫,滑动切换,点击底部bar瞬间切换,滑动切换渐变效果,线上效果图: 之前也在博客上看到别人的实现,再次基础上,我做了些优化.首先说下实现原理,大神略过,o(╯□╰)o 页面上看到的三个页面是三个Fragment, 左右滑动使用viewpager,相信大家也都是这么再用,那么底部用的是什么技术呢,底部渐变其实就是重写了ImageView,以及在左右滑动时,改变了TextView的颜色值,是不是很简单...下面我们一步一步的来: 1.自定义ImageView:

[Android] 使用Include布局+Fragment滑动切换屏幕

    前面的文章已经讲述了"随手拍"项目图像处理的技术部分,该篇文章主要是主界面的布局及屏幕滑动切换,并结合鸿洋大神的视频和郭神的第一行代码(强推两人Android博客),完成了下面的内容:     (1).学习使用Include布局XML     (2).通过添加适配器加载fragment     (3).实现滑动触摸切换屏幕ViewPager     (4).改变图标及背景,并响应fragment中控件及传递参数 参考资料: 郭霖大神的<Android第一行代码> 鸿

viewpager+fragment的懒加载实现微信点击和滑动切换功能(切换效果)

前言 1.从上一片文章之后已经半年没有写文章了,那篇文章之后公司进入疯狂的加班,一直到放年假.年后回来之后换了一家创业公司之后,然后又进入疯狂的加班(≧﹏ ≦) -所以一直都没有写文章(其实这都是借口⊙﹏⊙).现在公司没有那么忙了,也该把文章捡起来了,这毕竟是百利有一害的事(一害:费时间). 2.这半年里除了对代码的热情更加高涨(虽然它总是虐我千百遍(≧﹏ ≦) ),还深深的中了爬山的毒,对于年轻的我来说,爬山让我明白了许多.懂得了许多,也锻炼了我的身体.对于程序员来说身体是非常重要的,大家在周

Android自定义顶部栏及侧滑菜单和fragment+viewpag滑动切换的实现

嘿嘿嘿,关于android滑动的操作,是不是经常都会用到呢. 我肯定也要学习一下啦. https://blog.csdn.net/u013184970/article/details/82882107 https://blog.csdn.net/qq_35820350/article/details/82460376 在网上学习了一下,这两篇文章写的不错. 来看一下效果 共有4各部分 1.自定义顶部栏 2.侧滑菜单 3.弹出菜单 4.标签滑动切换 进入具体实现环节啦 第一 .自定义顶部栏 1.先

Android ViewPager和Fragment实现顶部导航界面滑动效果

在项目中,我们常常需要实现界面滑动切换的效果.例如,微信界面的左右滑动切换效果.那这种效果是怎么实现的?今天我就带大家简单了解ViewPager,并通过实例来实现该效果. 一. ViewPager 官方API 首先我们来看一下ViewPager官方给出的解释,如图: 具体意思如下: Layout 管理器允许用户可以在页面上,左右滑动来翻动页面.你可以考虑实现PagerAdapter接口来显示该效果. ViewPager很多时候会结合Fragment一块使用,这种方法使得管理每个页面的生命周期变得

Android:简单实现ViewPager+TabHost+TabWidget实现导航栏导航和滑动切换

viewPager是v4包里的一个组件,可以实现滑动显示多个界面. android也为viewPager提供了一个adapter,此adapter最少要重写4个方法: public int getCount() public boolean isViewFromObject(View view, Object o) public void destroyItem(ViewGroup container, int position, Object object)  public Object in