精华内容
参与话题
问答
  • 笔者乐意在用Sublime里编写代码时,经常需要把TAB键转换成四个空格。 哪么在 Sublime Text3里,怎么操作呢,可以快速解决这个问题呢? 研究了下, 具体步骤如下: 1. 菜单栏里点击 Preferences-> Setting-User...

    笔者乐意在用Sublime里编写代码时,经常需要把TAB键转换成四个空格。

     

    哪么在 Sublime Text3里,怎么操作呢,可以快速解决这个问题呢?
    研究了下,
    具体步骤如下: 

    1. 菜单栏里点击 Preferences-> Setting-User, 如图

     

    2. 在弹出来的文本里,添加如下两行:

    {

        // 注意只有一个大括号,如果之前有属性,如在之前的属性前确保有 ,(逗号)

        //把 tab 转换成4个空格
        "tab_size": 4,

        //把tab 转换成 空格
        "translate_tabs_to_spaces": true 

       //关于下行说明, 若不存在, 请手动添加. 若要在保存时自动把tab 转换成空格,请把值设置成 true,如不需要: 设置成 false

        "expand_tabs_on_save": true
    }

    如下图:

     

    2.1 于 2017-08-25的相关补充.

    注意:  关于 expand_tabs_on_save  的说明 

       //关于下行说明, 若不存在, 请手动添加. 若要在保存时自动把tab 转换成空格,请把值设置成 true,如不需要: 设置成 false

        "expand_tabs_on_save": true

    // 2017-08-25 日修正.
    //把 tab 转换成4个空格
    "tab_size": 4,
    //把tab 转换成 空格
    "translate_tabs_to_spaces": true,
    //关于下行说明, 若不存在, 请手动添加. 若要在保存时自动把tab 转换成空格,请把值设置成 true,如不需要: 设置成 false
    "expand_tabs_on_save": true,
    //此行的主要作用是, 当某行为空格且无其它字符时, 保存时会去除空白
    "trim_trailing_white_space_on_save": true,

    修改如下图: 

     

    补充图一: 配置相关参数

    注:修改后保存文件,看到右下角显示 Spaces:4 就说明修改成功!

     

    补充图二: 手动配置大体位置

     

    补充图三: 利用右下角进行手动转换

     

    3. 至此,配置完成了。

    验证一下,起初未按 Tab 键,无空格。

    按下 Tab 键, 四个空格。修改成功。

    ---------------------------------------------------------------------------------------------------------------

    【乐意黎原创,禁止采集或转载】

    本文地址:http://blog.csdn.net/aerchi/article/details/50395288

    展开全文
  • Android现在实现Tab类型的界面方式越来越多,今天就把常见的实现方式给大家来个总结。目前写了: 1、传统的ViewPager实现 2、FragmentManager+Fragment实现 3、ViewPager+FragmentPagerAdapter实现 4、...

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/24740977

    Android现在实现Tab类型的界面方式越来越多,今天就把常见的实现方式给大家来个总结。目前写了:

    1、传统的ViewPager实现

    2、FragmentManager+Fragment实现

    3、ViewPager+FragmentPagerAdapter实现

    4、TabPageIndicator+ViewPager+FragmentPagerAdapter


    1、传统的ViewPager实现

    主要就是ViewPager+ViewAdapter这个还是比较常见的,就不多说了

    效果图:


    代码:

    package com.example.mainframework02;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.support.v4.view.PagerAdapter;
    import android.support.v4.view.ViewPager;
    import android.support.v4.view.ViewPager.OnPageChangeListener;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.ImageButton;
    import android.widget.ImageView;
    import android.widget.LinearLayout;
    
    public class TraditionalViewPagerAcvitity extends Activity
    {
    
    	/**
    	 * ViewPager
    	 */
    	private ViewPager mViewPager;
    	/**
    	 * ViewPager的适配器
    	 */
    	private PagerAdapter mAdapter;
    	private List<View> mViews;
    	private LayoutInflater mInflater;
    	
    	private int currentIndex;
    
    	/**
    	 * 底部四个按钮
    	 */
    	private LinearLayout mTabBtnWeixin;
    	private LinearLayout mTabBtnFrd;
    	private LinearLayout mTabBtnAddress;
    	private LinearLayout mTabBtnSettings;
    
    	@Override
    	protected void onCreate(Bundle savedInstanceState)
    	{
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_main);
    		mInflater = LayoutInflater.from(this);
    		mViewPager = (ViewPager) findViewById(R.id.id_viewpager);
    		
    		/**
    		 * 初始化View
    		 */
    		initView();
    		
    		mViewPager.setAdapter(mAdapter);
    
    		mViewPager.setOnPageChangeListener(new OnPageChangeListener()
    		{
    
    			@Override
    			public void onPageSelected(int position)
    			{
    				resetTabBtn();
    				switch (position)
    				{
    				case 0:
    					((ImageButton) mTabBtnWeixin.findViewById(R.id.btn_tab_bottom_weixin))
    							.setImageResource(R.drawable.tab_weixin_pressed);
    					break;
    				case 1:
    					((ImageButton) mTabBtnFrd.findViewById(R.id.btn_tab_bottom_friend))
    							.setImageResource(R.drawable.tab_find_frd_pressed);
    					break;
    				case 2:
    					((ImageButton) mTabBtnAddress.findViewById(R.id.btn_tab_bottom_contact))
    							.setImageResource(R.drawable.tab_address_pressed);
    					break;
    				case 3:
    					((ImageButton) mTabBtnSettings.findViewById(R.id.btn_tab_bottom_setting))
    							.setImageResource(R.drawable.tab_settings_pressed);
    					break;
    				}
    
    				currentIndex = position;
    			}
    
    			@Override
    			public void onPageScrolled(int arg0, float arg1, int arg2)
    			{
    
    			}
    
    			@Override
    			public void onPageScrollStateChanged(int arg0)
    			{
    			}
    		});
    
    	}
    
    	protected void resetTabBtn()
    	{
    		((ImageButton) mTabBtnWeixin.findViewById(R.id.btn_tab_bottom_weixin))
    				.setImageResource(R.drawable.tab_weixin_normal);
    		((ImageButton) mTabBtnFrd.findViewById(R.id.btn_tab_bottom_friend))
    				.setImageResource(R.drawable.tab_find_frd_normal);
    		((ImageButton) mTabBtnAddress.findViewById(R.id.btn_tab_bottom_contact))
    				.setImageResource(R.drawable.tab_address_normal);
    		((ImageButton) mTabBtnSettings.findViewById(R.id.btn_tab_bottom_setting))
    				.setImageResource(R.drawable.tab_settings_normal);
    	}
    
    	private void initView()
    	{
    
    		mTabBtnWeixin = (LinearLayout) findViewById(R.id.id_tab_bottom_weixin);
    		mTabBtnFrd = (LinearLayout) findViewById(R.id.id_tab_bottom_friend);
    		mTabBtnAddress = (LinearLayout) findViewById(R.id.id_tab_bottom_contact);
    		mTabBtnSettings = (LinearLayout) findViewById(R.id.id_tab_bottom_setting);
    
    		mViews = new ArrayList<View>();
    		View first = mInflater.inflate(R.layout.main_tab_01, null);
    		View second = mInflater.inflate(R.layout.main_tab_02, null);
    		View third = mInflater.inflate(R.layout.main_tab_03, null);
    		View fourth = mInflater.inflate(R.layout.main_tab_04, null);
    		mViews.add(first);
    		mViews.add(second);
    		mViews.add(third);
    		mViews.add(fourth);
    
    		mAdapter = new PagerAdapter()
    		{
    			@Override
    			public void destroyItem(ViewGroup container, int position, Object object)
    			{
    				container.removeView(mViews.get(position));
    			}
    
    			@Override
    			public Object instantiateItem(ViewGroup container, int position)
    			{
    				View view = mViews.get(position);
    				container.addView(view);
    				return view;
    			}
    
    			@Override
    			public boolean isViewFromObject(View arg0, Object arg1)
    			{
    				return arg0 == arg1;
    			}
    
    			@Override
    			public int getCount()
    			{
    				return mViews.size();
    			}
    		};
    	}
    
    }
    
    评价:所有的代码都集中在一个Activity中,显得代码比较乱。

    2、FragmentManager+Fragment实现

    主要利用了Fragment在主内容界面对Fragment的add,hide等事务操作。

    效果图:


    代码:

    主Activity

    package com.example.mainframework02.fragment;
    
    import android.annotation.SuppressLint;
    import android.app.Activity;
    import android.app.FragmentManager;
    import android.app.FragmentTransaction;
    import android.os.Bundle;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.ImageButton;
    import android.widget.LinearLayout;
    
    import com.example.mainframework02.R;
    
    public class FragmentMainActivity extends Activity implements OnClickListener
    {
    	private MainTab02 mTab02;
    	private MainTab01 mTab01;
    	private MainTab03 mTab03;
    	private MainTab04 mTab04;
    
    	/**
    	 * 底部四个按钮
    	 */
    	private LinearLayout mTabBtnWeixin;
    	private LinearLayout mTabBtnFrd;
    	private LinearLayout mTabBtnAddress;
    	private LinearLayout mTabBtnSettings;
    	/**
    	 * 用于对Fragment进行管理
    	 */
    	private FragmentManager fragmentManager;
    
    	@SuppressLint("NewApi")
    	@Override
    	protected void onCreate(Bundle savedInstanceState)
    	{
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.fragment_main);
    		initViews();
    		fragmentManager = getFragmentManager();
    		setTabSelection(0);
    	}
    
    	
    
    	private void initViews()
    	{
    
    		mTabBtnWeixin = (LinearLayout) findViewById(R.id.id_tab_bottom_weixin);
    		mTabBtnFrd = (LinearLayout) findViewById(R.id.id_tab_bottom_friend);
    		mTabBtnAddress = (LinearLayout) findViewById(R.id.id_tab_bottom_contact);
    		mTabBtnSettings = (LinearLayout) findViewById(R.id.id_tab_bottom_setting);
    
    		mTabBtnWeixin.setOnClickListener(this);
    		mTabBtnFrd.setOnClickListener(this);
    		mTabBtnAddress.setOnClickListener(this);
    		mTabBtnSettings.setOnClickListener(this);
    	}
    
    	@Override
    	public void onClick(View v)
    	{
    		switch (v.getId())
    		{
    		case R.id.id_tab_bottom_weixin:
    			setTabSelection(0);
    			break;
    		case R.id.id_tab_bottom_friend:
    			setTabSelection(1);
    			break;
    		case R.id.id_tab_bottom_contact:
    			setTabSelection(2);
    			break;
    		case R.id.id_tab_bottom_setting:
    			setTabSelection(3);
    			break;
    
    		default:
    			break;
    		}
    	}
    
    	/**
    	 * 根据传入的index参数来设置选中的tab页。
    	 * 
    	 */
    	@SuppressLint("NewApi")
    	private void setTabSelection(int index)
    	{
    		// 重置按钮
    		resetBtn();
    		// 开启一个Fragment事务
    		FragmentTransaction transaction = fragmentManager.beginTransaction();
    		// 先隐藏掉所有的Fragment,以防止有多个Fragment显示在界面上的情况
    		hideFragments(transaction);
    		switch (index)
    		{
    		case 0:
    			// 当点击了消息tab时,改变控件的图片和文字颜色
    			((ImageButton) mTabBtnWeixin.findViewById(R.id.btn_tab_bottom_weixin))
    					.setImageResource(R.drawable.tab_weixin_pressed);
    			if (mTab01 == null)
    			{
    				// 如果MessageFragment为空,则创建一个并添加到界面上
    				mTab01 = new MainTab01();
    				transaction.add(R.id.id_content, mTab01);
    			} else
    			{
    				// 如果MessageFragment不为空,则直接将它显示出来
    				transaction.show(mTab01);
    			}
    			break;
    		case 1:
    			// 当点击了消息tab时,改变控件的图片和文字颜色
    			((ImageButton) mTabBtnFrd.findViewById(R.id.btn_tab_bottom_friend))
    					.setImageResource(R.drawable.tab_find_frd_pressed);
    			if (mTab02 == null)
    			{
    				// 如果MessageFragment为空,则创建一个并添加到界面上
    				mTab02 = new MainTab02();
    				transaction.add(R.id.id_content, mTab02);
    			} else
    			{
    				// 如果MessageFragment不为空,则直接将它显示出来
    				transaction.show(mTab02);
    			}
    			break;
    		case 2:
    			// 当点击了动态tab时,改变控件的图片和文字颜色
    			((ImageButton) mTabBtnAddress.findViewById(R.id.btn_tab_bottom_contact))
    					.setImageResource(R.drawable.tab_address_pressed);
    			if (mTab03 == null)
    			{
    				// 如果NewsFragment为空,则创建一个并添加到界面上
    				mTab03 = new MainTab03();
    				transaction.add(R.id.id_content, mTab03);
    			} else
    			{
    				// 如果NewsFragment不为空,则直接将它显示出来
    				transaction.show(mTab03);
    			}
    			break;
    		case 3:
    			// 当点击了设置tab时,改变控件的图片和文字颜色
    			((ImageButton) mTabBtnSettings.findViewById(R.id.btn_tab_bottom_setting))
    					.setImageResource(R.drawable.tab_settings_pressed);
    			if (mTab04 == null)
    			{
    				// 如果SettingFragment为空,则创建一个并添加到界面上
    				mTab04 = new MainTab04();
    				transaction.add(R.id.id_content, mTab04);
    			} else
    			{
    				// 如果SettingFragment不为空,则直接将它显示出来
    				transaction.show(mTab04);
    			}
    			break;
    		}
    		transaction.commit();
    	}
    
    	/**
    	 * 清除掉所有的选中状态。
    	 */
    	private void resetBtn()
    	{
    		((ImageButton) mTabBtnWeixin.findViewById(R.id.btn_tab_bottom_weixin))
    				.setImageResource(R.drawable.tab_weixin_normal);
    		((ImageButton) mTabBtnFrd.findViewById(R.id.btn_tab_bottom_friend))
    				.setImageResource(R.drawable.tab_find_frd_normal);
    		((ImageButton) mTabBtnAddress.findViewById(R.id.btn_tab_bottom_contact))
    				.setImageResource(R.drawable.tab_address_normal);
    		((ImageButton) mTabBtnSettings.findViewById(R.id.btn_tab_bottom_setting))
    				.setImageResource(R.drawable.tab_settings_normal);
    	}
    
    	/**
    	 * 将所有的Fragment都置为隐藏状态。
    	 * 
    	 * @param transaction
    	 *            用于对Fragment执行操作的事务
    	 */
    	@SuppressLint("NewApi")
    	private void hideFragments(FragmentTransaction transaction)
    	{
    		if (mTab01 != null)
    		{
    			transaction.hide(mTab01);
    		}
    		if (mTab02 != null)
    		{
    			transaction.hide(mTab02);
    		}
    		if (mTab03 != null)
    		{
    			transaction.hide(mTab03);
    		}
    		if (mTab04 != null)
    		{
    			transaction.hide(mTab04);
    		}
    		
    	}
    
    }
    

    各个TabFragment,一共四个TabFragment,下面贴出两个,基本都一样。

    package com.example.mainframework02.fragment;
    
    import android.annotation.SuppressLint;
    import android.app.Fragment;
    import android.os.Bundle;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    
    @SuppressLint("NewApi")
    public class MainTab01 extends Fragment
    {
    
    	@Override
    	public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    	{
    		return inflater.inflate(com.example.mainframework02.R.layout.main_tab_01, container, false);
    
    	}
    
    }
    

    package com.example.mainframework02.fragment;
    
    import android.annotation.SuppressLint;
    import android.app.Fragment;
    import android.os.Bundle;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    
    import com.example.mainframework02.R;
    
    @SuppressLint("NewApi")
    public class MainTab02 extends Fragment
    {
    
    	public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    	{
    		return inflater.inflate(R.layout.main_tab_02, container, false);
    
    	}
    
    }
    
    评价:每个Fragment中的控件的处理,都是独立到各自的类中,相对来说主Activity简化了不少,可惜没有左右滑动的效果了。


    3、ViewPager+Fragment实现

    主要通过ViewPager和FragmentPagerAdapter一起来实现。

    效果图:


    代码:

    主Activity

    package com.example.mainframework03;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import android.os.Bundle;
    import android.support.v4.app.Fragment;
    import android.support.v4.app.FragmentActivity;
    import android.support.v4.app.FragmentPagerAdapter;
    import android.support.v4.view.ViewPager;
    import android.support.v4.view.ViewPager.OnPageChangeListener;
    import android.widget.ImageButton;
    import android.widget.LinearLayout;
    
    public class MainActivity extends FragmentActivity
    {
    
    	private ViewPager mViewPager;
    	private FragmentPagerAdapter mAdapter;
    	private List<Fragment> mFragments = new ArrayList<Fragment>();
    	
    	
    	/**
    	 * 底部四个按钮
    	 */
    	private LinearLayout mTabBtnWeixin;
    	private LinearLayout mTabBtnFrd;
    	private LinearLayout mTabBtnAddress;
    	private LinearLayout mTabBtnSettings;
    
    
    	@Override
    	protected void onCreate(Bundle savedInstanceState)
    	{
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_main);
    		mViewPager = (ViewPager) findViewById(R.id.id_viewpager);
    
    		
    		initView();
    		
    		
    
    		mAdapter = new FragmentPagerAdapter(getSupportFragmentManager())
    		{
    
    			@Override
    			public int getCount()
    			{
    				return mFragments.size();
    			}
    
    			@Override
    			public Fragment getItem(int arg0)
    			{
    				return mFragments.get(arg0);
    			}
    		};
    		
    		mViewPager.setAdapter(mAdapter);
    		
    		
    		mViewPager.setOnPageChangeListener(new OnPageChangeListener()
    		{
    
    			private int currentIndex;
    
    			@Override
    			public void onPageSelected(int position)
    			{
    				resetTabBtn();
    				switch (position)
    				{
    				case 0:
    					((ImageButton) mTabBtnWeixin.findViewById(R.id.btn_tab_bottom_weixin))
    							.setImageResource(R.drawable.tab_weixin_pressed);
    					break;
    				case 1:
    					((ImageButton) mTabBtnFrd.findViewById(R.id.btn_tab_bottom_friend))
    							.setImageResource(R.drawable.tab_find_frd_pressed);
    					break;
    				case 2:
    					((ImageButton) mTabBtnAddress.findViewById(R.id.btn_tab_bottom_contact))
    							.setImageResource(R.drawable.tab_address_pressed);
    					break;
    				case 3:
    					((ImageButton) mTabBtnSettings.findViewById(R.id.btn_tab_bottom_setting))
    							.setImageResource(R.drawable.tab_settings_pressed);
    					break;
    				}
    
    				currentIndex = position;
    			}
    
    			@Override
    			public void onPageScrolled(int arg0, float arg1, int arg2)
    			{
    
    			}
    
    			@Override
    			public void onPageScrollStateChanged(int arg0)
    			{
    			}
    		});
    
    	}
    	
    	protected void resetTabBtn()
    	{
    		((ImageButton) mTabBtnWeixin.findViewById(R.id.btn_tab_bottom_weixin))
    				.setImageResource(R.drawable.tab_weixin_normal);
    		((ImageButton) mTabBtnFrd.findViewById(R.id.btn_tab_bottom_friend))
    				.setImageResource(R.drawable.tab_find_frd_normal);
    		((ImageButton) mTabBtnAddress.findViewById(R.id.btn_tab_bottom_contact))
    				.setImageResource(R.drawable.tab_address_normal);
    		((ImageButton) mTabBtnSettings.findViewById(R.id.btn_tab_bottom_setting))
    				.setImageResource(R.drawable.tab_settings_normal);
    	}
    
    	private void initView()
    	{
    
    		mTabBtnWeixin = (LinearLayout) findViewById(R.id.id_tab_bottom_weixin);
    		mTabBtnFrd = (LinearLayout) findViewById(R.id.id_tab_bottom_friend);
    		mTabBtnAddress = (LinearLayout) findViewById(R.id.id_tab_bottom_contact);
    		mTabBtnSettings = (LinearLayout) findViewById(R.id.id_tab_bottom_setting);
    
    		MainTab01 tab01 = new MainTab01();
    		MainTab02 tab02 = new MainTab02();
    		MainTab03 tab03 = new MainTab03();
    		MainTab04 tab04 = new MainTab04();
    		mFragments.add(tab01);
    		mFragments.add(tab02);
    		mFragments.add(tab03);
    		mFragments.add(tab04);
    	}
    }
    

    还有4个TabFragment,下面贴一个,四个基本一样

    package com.example.mainframework03;
    
    import android.os.Bundle;
    import android.support.v4.app.Fragment;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    
    public class MainTab01 extends Fragment
    {
    
    	@Override
    	public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    	{
    		return  inflater.inflate(R.layout.main_tab_01, container, false);
    	
    	}
    
    }
    
    评价:实现效果和第一种效果一模一样,每个Fragment独自处理自己内部的逻辑,代码整洁很多,并且支持左右滑动。感觉是第一种和第二种的结合版本。


    4、TabPageIndicator+ViewPager+FragmentPagerAdapter

    实现方式和3是一致的,但是使用了TabPageIndicator作为tab的指示器,效果还是不错的,这个之前写过,就不再贴代码了。

    效果图:


    参考Android 使用Fragment,ViewPagerIndicator 制作csdn app主要框架


    好了,就总结了这么多,肯定还有很多别的实现方式,大家可以留言,有时间会继续完善这篇总结的。



    第一种和第二种的源码

    第三种方式的源码

    本来想一起,无奈,一会v4.Fragment一会Fragment就分开了,嘿嘿,各位留个言,赞一个,算是对我的支持。



    该博客视频教程已经更新:多种多样的App主界面Tab实现方法 ,期待您的关注。








    展开全文
  • Flutter切换tab后保留tab状态

    万次阅读 2018-07-24 11:35:57
    Flutter切换tab后保留tab状态 概述 Flutter中为了节约内存不会保存widget的状态,widget都是临时变量。当我们使用TabBar,TabBarView是我们就会发现,切换tab后再重新切换回上一页面,这时候tab会重新加载重新...

    Flutter切换tab后保留tab状态

    概述

    Flutter中为了节约内存不会保存widget的状态,widget都是临时变量。当我们使用TabBar,TabBarView是我们就会发现,切换tab后再重新切换回上一页面,这时候tab会重新加载重新创建,体验很不友好。Flutter出于自己的设计考虑并没有延续android的ViewPager这样的缓存页面设计,毕竟控件两端都要开发,目前还在beta版本有很多设计还不够完善,但是设计的拓展性没得说,flutter还是为我们提供了解决办法。我们可以强制widget不显示情况下保留状态,下回再加载时就不用重新创建了。

    AutomaticKeepAliveClientMixin

    AutomaticKeepAliveClientMixin 是一个抽象状态,使用也很简单,我们只需要用我们自己的状态继承这个抽象状态,并实现 wantKeepAlive 方法即可。

    继承这个状态后,widget在不显示之后也不会被销毁仍然保存在内存中,所以慎重使用这个方法。

    详细官方文档请看这里
    这里还有一个说的比较详细的 demo

    class PageContentState extends<PageContent> 
        with AutomaticKeepAliveClientMixin {
    
        @override
        bool get wantKeepAlive => true;
    
    }

    DEMO

    // main.dart
    // 核心代码如下:
    
    class PageContent extends StatefulWidget {
      @override
      State<StatefulWidget> createState() => new PageContentState();
    }
    
    class PageContentState extends State<PageContent>
        with AutomaticKeepAliveClientMixin
    {
    
      @override
      bool get wantKeepAlive => true;
    
      ···
    }
    
    class V2EX extends StatelessWidget {
      // This widget is the root of your application.
      @override
      Widget build(BuildContext context) {
        return new MaterialApp(
            title: 'Flutter Demo',
            theme: new ThemeData(
                primaryColor: Colors.white),
            home: new DefaultTabController(
              length: choices.length,
              child: new Scaffold(
                appBar: new AppBar(
                  title: new Center(
                    child: new Container(
                      width: 300.0,
                      child: new TabBar(
                        indicatorColor: Colors.black54,
                        isScrollable: true,
                        tabs: choices.map((Choice choice) {
                          return new Container(
                            width: 125.0,
                            child: new Tab(
                              text: choice.title,
                            ),
                          );
                        }).toList(),
                      ),
                    ),
                  ),
                ),
                body: new TabBarView(
                  key: new Key('Home Page'),
                  children: choices.map((Choice choice) {
                    return new Padding(
                      padding: const EdgeInsets.all(16.0),
                      child: new ChoiceCard(choice: choice),
                    );
                  }).toList(),
                ),
              ),
            ));
      }
    }
    
    const List<Choice> choices = const <Choice>[
      const Choice(title: '热门'),
      const Choice(title: '最新'),
    ];
    
    class ChoiceCard extends StatelessWidget {
      const ChoiceCard({Key key, this.choice}) : super(key: key);
    
      final Choice choice;
    
      @override
      Widget build(BuildContext context) {
        return new Card(
          color: Colors.white,
          child: PageContent(),
        );
      }
    }
    展开全文
  • tab切换组件nz-tab

    千次阅读 2019-06-11 10:40:00
    <nz-card [nzBordered]="true" nzTitle="卡片标题"> <nz-card style="width: 100%;" nzTitle="Card title" [nzExtra]="extraTemplate"> <nz-card-tab>...nz-tabset nzSize="l...

     

    <nz-card [nzBordered]="true" nzTitle="卡片标题">
      <nz-card style="width: 100%;" nzTitle="Card title" [nzExtra]="extraTemplate">
        <nz-card-tab>
          <nz-tabset nzSize="large" [(nzSelectedIndex)]="selectIndex">
            <nz-tab [nzTitle]="item.title" *ngFor="let item of tabs" (nzClick)="tabTo(item)"></nz-tab>
          </nz-tabset>
        </nz-card-tab>
        <router-outlet></router-outlet>
      </nz-card>
    </nz-card>
    import { Component, OnInit } from '@angular/core';
    import { Router } from '@angular/router';
    @Component({
      selector: 'app-card-whole-consume',
      templateUrl: './card-whole-consume.component.html',
      styles: []
    })
    export class CardWholeConsumeComponent implements OnInit {
      selectIndex = 0;
      tabs: any[] = [
        {
          key: 'dashboard',
          title: '标题1'
        }, {
          key: 'department-salary-setting',
          title: '标题2'
        }
      ];
      constructor(private router: Router) { }
      ngOnInit() {
        this.initTab();
      }
      initTab() {
        // 设置再次刷新页面时还是显示之前的tab
        const key = this.router.url.substr(this.router.url.lastIndexOf('/') + 1);
        const idx = this.tabs.findIndex(w => w.key === key);
        this.selectIndex = idx;
        this.router.navigateByUrl(`/cardWhole/${this.tabs[this.selectIndex].key}`);
      }
      tabTo(tab) {
         this.router.navigateByUrl(`/cardWhole/${tab.key}`);
      }
    }

     

    转载于:https://www.cnblogs.com/yuyedaocao/p/11002279.html

    展开全文
  • jquery tab 水平tab分页

    千次阅读 2012-10-10 21:07:16
    jquery tab 水平tab分页
  • vs 2017 C# TAB+TAB 代码补全

    千次阅读 2018-09-21 09:02:11
    cw + Tab + Tab 输出 Console.WriteLine();   try +Tab+Tab 输出 try catch代码块   foreach + Tab + Tab 输出 foreach 循环  for+ Tab + Tab 输出 for 循环   ctor +Tab+Tab ...
  • 在移动应用中,大部分应用都是底部会有几个 tab 切换页。只是在底部切换到相应的页面,并且 tab 样式状态改变很容易实现,但是如果是其他页面跳转到 tab 页,tab 样式改变要如何实现昵?如下图,假设点击提交之后要...
  • 在vscode中显示空格和tab符号

    万次阅读 2019-01-16 08:43:44
    使用python时最烦人的就是代码对齐,而且tab和空格还不一样,为了便于对其,希望把tab和空格显示 出来.网上百度了一个解决方法,和我的不完全一样,不过还是解决了. -广泛化工和 打开setting,在搜索框中输入...
  • html,css,js实现简单的Tab(tab)选项卡切换效果——延迟切换 1.Demo展示: 计时器未生效: 计时器事件生效: 如要实现马上切换效果,请查看:link...
  • Bootstrap Tab

    千次阅读 2017-11-13 14:17:25
    Bootstrap Tab参考: Bootstrap JS Tab 选项卡1..nav nav-tabs类创建标签页 <li class="active"><a href="#">Home</a></li> <li><a href="#">HTML</a></li> <li><a href=
  • 在项目中需要关闭当前tab标签页和关闭所有tab标签页。 关闭当前tab标签页: function closeThis(){ top.layui.element.tabDelete("tab", top.jQuery(".layui-tab-title .layui-this").attr("lay-id")); } 关闭...
  • 目录 错误界面 解决方案 第一,设置mysql时区。 第二,同步mysql驱动。 前进的道路充满荆棘。 错误界面 IDEA连接mysql,地址,用户名,密码,数据库名,全都配置好了,点测试连接,咔!...网...
  • jQ+ Bootstrap 动态控制tab页面切换最近在做一个功能,一个页面包含多个tab页签,每一个tab页面都有保存和提交按钮功能,现在是希望在某个tab页面点击保存或者提交按钮提交表单后,重新加载的页面停留在当前操作的tab...
  • 参考: ALL_TAB_COLS,ALL_TAB_COLUMNS 1,相同点和区别 这几个视图,都可以用于获取数据库中的表,视图,Clusters中的数据。 区别: 1)_TAB_COLS和_TAB_COLUMNS区别在于,*_TAB_COLS中包含隐藏的列。 【HIDDEN_...
  • Layui 内置方法 - layer.tab(tab层)

    千次阅读 2019-04-22 11:29:07
    tab层只单独定制了一个成员,即tab: [],这个好像没有什么可介绍的,简单粗暴看例子 layer.tab({ area: ['600px', '300px'], tab: [{ title: 'TAB1', content: '内容1' }, { title: 'TAB2', content: '内容...
  • 项目中有个多 tab 嵌套的需求,进入程序主界面下面有两个 tab,进入A模块后,A模块最底下又有多个tab,每个tab上又嵌了2-4个不等的tab。。。 这种变态需求只能自定义tab了。 其实如果项目不是很复杂,没有多tab...
  • easyui实现关闭当前tab并打开新的tab

    千次阅读 2019-08-30 15:16:23
    //子页面操作tab的JS function testAddSubPage(title,url){ var jq = top.jQuery; //关闭当前tab jq('#tb').tabs('close', '账户信息'); //账户信息为当前tab的title //打开新tab if ...
  • 1.说明 项目中遇到需求,需要通过按钮点击事件切换tab页面 ...#evalBaseInfoTab 为tab控件id,通过以下函数可以获取到控件中第几个tab页激活 function getCurrentTabIndex(){ var $tabs = $('...
  • IDEA设置Tab选项卡

    千次阅读 2018-12-25 17:04:35
    IDEA设置Tab选项卡 本人喜欢把tab选项卡全部放出来(tab选项卡默认是10个,超过后会把最先打开的挤出去,像队列一样先进先出),比如这样(多行显示): 当然也有人喜欢这样的(一行显示): 如果需要设置成多行...
  • HTML——tab标签

    万次阅读 2018-12-16 21:25:06
      小编最近在做项目的时候前端需要tab标签来进行角色分类,小编的公司用的是angular,虽然一般情况下angular挺好用的,但是这次例外了,angular的标签并不能良好的达到我想要的效果,于是小编找了一个html改装的...
  • 三星Galaxy Tab S6与Tab S7的任何区别

    千次阅读 2020-08-31 23:46:22
    Samsung’s Galaxy Tab S7 was recently announced at Samsung’s Unpacked event which featured products like the Note20 Ultra, Galaxy Buds Live, and more products! Last year, Samsung released the Galaxy ...
  • vux的tab控件实现头部tab栏切换功能

    千次阅读 2019-03-08 16:05:19
    项目中使用vux的tab控件实现头部tab栏切换功能 1、子组件定义(例:tab1): &lt;template&gt; &lt;div class="charge-view acc-child" slot="tab1"&gt;sdfg&lt;/div&...
  • html实现tab页及切换

    万次阅读 热门讨论 2018-11-22 13:46:14
    tab切换通过js和jquery实现,代码如下(主要是调css样式比较麻烦,其他的都比较简单): 1、页面切换通过js实现(有点繁琐,每个tab都要写一个onclick方法): &lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD ...
  • 如何在idea中将tab键设置为按一下代表4个空格

    万次阅读 多人点赞 2017-11-22 15:27:39
    步骤如下图(ctrl+alt+s 打开如下图设置界面): Editor-->Code Style --> java(如果使用的是其他编程语言请选择其他语言)-->不要勾选 Use tab character -->Indent设置为4(表示按一下tab键代表4个空格)
  • 1.打开新Tab parent.layui.index.openTabsPage(url, title); 2.关闭当前Tab parent.layui.admin.events.closeThisTabs();
  • Android-Tab

    千次阅读 2016-02-22 16:02:22
    SmartTabLayout我的地址:https://github.com/kongqw/Android-Tab开源地址:https://github.com/ogaclejapan/SmartTabLayout Android PagerSlidingTabStrip我的地址:https://github.com/kongqw/Android-Tab2...
  • 描述:运用sortable.js开发一个可以拖拽tabtab内容,以及互换tab里面的内容的效果tab之间可以拖拽;每单个tab里面的内容可以拖拽换位置;tab之间的内容可以拖拽(第一个tab里面的某个内容拖拽到其他的tab里面)...
  • tab吸顶效果的原理:改变tab的布局,当tab还在下面的时候,是正常的布局,当tab滑到顶部的时候,把tab改为绝对定位或者fixed定位来做,那如何知道tab是否滑到顶部,就要用scrollTop来计算,在这里可以在滚动的区域...
  • 在命令模式下: set et 将Tab用空格替换; set et! 取消使用空格替换Tab

空空如也

1 2 3 4 5 ... 20
收藏数 191,465
精华内容 76,586
关键字:

tab