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

               

对于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开发相关文章

           

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

猜你喜欢

转载自blog.csdn.net/skdhfdfc/article/details/86649587
今日推荐