• 【转】 Pro Android学习笔记(四十):Fragment(5):适应不同屏幕或排版


    目录(?)[-]

    1. 设置横排和竖排的不同排版风格
    2. 改写代码

    对于fragment,经常涉及不同屏幕尺寸和不同的排版风格。我们在基础小例子上做一下改动,在横排的时候,仍是现实左右两个fragment,在竖排时,如下图显示:

    屏幕上只显示一个fragment,点击列表上的数目,进入到简介的activity。下面介绍实现的方式。

    设置横排和竖排的不同排版风格

    在 Pro Android学习笔记(四):了解Android资源(下)的“资源和配置的变更”中,我们介绍了如何同资源文件夹名设置不同资源。缺省的layout/fragment_basic.xml,设置为竖排格式,只含有1个fragment,如下

    <?xml version="1.0" encoding="utf-8"?> 
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
        android:layout_width="match_parent" 
        android:layout_height="match_parent" 
        android:orientation="horizontal" > 
        <fragment class="com.wei.flowingflying.pro.ProFragment.TitleFragment" 
            android:id="@+id/titles"         
            android:layout_width="match_parent" 
            android:layout_height="match_parent" /> 
    </LinearLayout>

    对于layout-land/fragment_basic.xml,即横排的格式,即原小例子的xml文件,含有2个fragment,这里不再重复。

    改写代码

    在Activity中,通过setContentView(),根据xml中fragment的class属性,自动调用TitleFragment,在TitleFragment中通过调用acitivity的showDetail(int index),来具体显示书的简介。

    private int mCurCheckPosition = -1; 

    原来设置0,现在该为-1,目的是区分是用户互动选择书目录,还是在横屏是缺省显示的书目简介的序号。

    对于FragmentBasicTest,也进行一些修改,具体如下:

    public class FragmentBasicTest extends Activity{ 
        @Override 
        protected void onCreate(Bundle savedInstanceState) { 
            setContentView(R.layout.fragment_basic); 
        } 
        //判断是否需要显示多个fragment 
        private boolean isMultPane(){ 
            return getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE;
        } 
        
        public void showDetails(int index){ 
            if(isMultPane()){  //显示左右两个fragement时,代码不变 
                if(index < 0 ) 
                    index = 0; 
                DetailFragment detail = (DetailFragment)getFragmentManager().findFragmentById(R.id.details);
                if(detail == null){ 
                    addFirstFragment(index); 
                }else if(detail.getShowIndex() != index ){ 
                    addFragmentToStack(index); 
                } 
            }else{  //只显示一个fragment时,唤起显示简介内容的Activity的
                if(index < 0) 
                    return; 
                Intent intent = new Intent(); 
                intent.setClass(this, DetailActivity.class); 
                intent.putExtra("index",index); 
                startActivity(intent); 
            } 
        } 
       …… 

    DetailActivity可以用xml设置具体的的布局,向普通的activity那样,将书简介内容呈现而用户。但是,我们已经有了相关显示处理的DetailFragment,我们应该充分利用,以保证代码的一致性。

    public class DetailActivity extends Activity{ 
        @Override 
        protected void onCreate(Bundle savedInstanceState) { 
            super.onCreate(savedInstanceState);       

             //当用户从竖屏模式切换到横屏,检测到模式为横屏是,退出activity,退到上一个activity中,显示横屏的双fragment。否则我们只会看到这个activity转向。
             if(getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE ){
                finish();
                return;
            }
            
            Intent intent = getIntent(); 
            if(intent == null){ 
                finish(); 
                return; 
            } 
            //在Acitvity中加入DetailFragment 
            DetailFragment detail = DetailFragment.newInstance(intent.getExtras());
            getFragmentManager().beginTransaction() 
               .add(android.R.id.content, detail)   //android.R.id.content是activity的top-level的view容器,将fragment与之关联即可。
                .commit();        
        } 

    }

    在FragmentTransaction的add(int containerViewID, Fragment fragment)中,容器ID使用了android.R.id.content,这将获得view的根元素(root element of a view)。

    本博文涉及的例子代码,可以在Pro Android学习:Fragment中下载。

    相关链接: 我的Android开发相关文章

  • 相关阅读:
    iview-cli 采坑记录
    js关于可视区高度的一些运算
    时间戳格式化
    快应用入坑指南
    webpack开发环境配置和生产环境配置
    webpack深入场景——开发环境和生产环境
    react-redux状态管理思想
    禁用浏览器双击时,选中文字的特性
    宝塔7.4.7专业版安装Nginx防火墙后,网站报错:ERR_CONNECTION_REFUSED的解决。
    帝国CMS修改模板或数据报错“您的请求带有不合法参数,已被网站管理员设置拦截!”
  • 原文地址:https://www.cnblogs.com/blongfree/p/5047977.html
Copyright © 2020-2023  润新知