第四章 手机平板要兼顾——探究碎片

  • 第四章
    • 4.1 碎片是什么
    • 4.2 碎片的使用方式
      • 4.2.1 碎片的简单实用
      • 4.2.2 动态添加碎片
      • 4.2.3 在碎片中模拟回收栈
      • 4.2.4 碎片和活动之间进行通信
    • 4.3 碎片的生命周期
      • 4.3.1 碎片的状态和回调
      • 4.3.2 体验碎片的生命周期
    • 4.4 动态加载布局的技巧
      • 4.4.1 使用限定符
      • 4.4.2 使用最小宽度限定符
    • 4.5 碎片的最佳实践——一个简易版的新闻应用

第四章

补充:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3ICBbv0u-1627825748253)(C:\Users\过客\AppData\Roaming\Typora\typora-user-images\image-20210729155139748.png)]

4.1 碎片是什么

  1. 概述:碎片(Fragment)是一种可以嵌入在活动当中的UI片段,它能让程序更加合理和充分地利用大屏幕的空间,因而在平板上应用得非常广泛

  2. 平板使用碎片实现如下布局:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jFL96NbZ-1627825748256)(C:\Users\过客\AppData\Roaming\Typora\typora-user-images\image-20210729103100474.png)]

4.2 碎片的使用方式

4.2.1 碎片的简单实用

  1. 使用步骤:

    1. 创建碎片的布局:

      左碎片布局:

      <?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="vertical"><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/button"android:layout_gravity="center_horizontal"android:text="@string/button"/></LinearLayout>
      

      右碎片布局:

      <?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="vertical"android:background="#00ff00"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center_horizontal"android:textSize="20sp"android:text="@string/this_is_right_fragment"/></LinearLayout>
      
    2. 为碎片布局文件创建对应的类,让此类继承Fragment类,重写onCreateView()方法,方法内部通过LayoutInflater的inflate()方法将刚才定义的布局动态加载进来

      左碎片类:

      package com.example.activity_tablet1;import android.os.Bundle;
      import android.view.LayoutInflater;
      import android.view.View;
      import android.view.ViewGroup;import androidx.fragment.app.Fragment;public class LeftFragment extends Fragment {@Overridepublic View onCreateView( LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {View view = inflater.inflate(R.layout.left_fragment,container,false);return view;}
      }

      右碎片类:

      package com.example.activity_tablet1;import android.os.Bundle;
      import android.view.LayoutInflater;
      import android.view.View;
      import android.view.ViewGroup;import androidx.fragment.app.Fragment;public class Right_fragment extends Fragment {@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {View view = inflater.inflate(R.layout.right_fragment, container, false);return view;}
      }
    3. 在著布局中加入碎片控件:

      <?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"><fragmentandroid:id="@+id/left_fragment"android:name="com.example.activity_tablet1.LeftFragment"android:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1" /><fragmentandroid:id="@+id/right_fragment"android:name="com.example.activity_tablet1.Right_fragment"android:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1" /></LinearLayout>
      

4.2.2 动态添加碎片

  1. 实现步骤:

    1. 先创建碎片布局;

      <?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:background="#ffff00"android:orientation="vertical"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center_horizontal"android:textSize="20sp"android:text="@string/this_is_another_right_fragment"/></LinearLayout>
      
    2. 创建碎片的动态加载类:

      package com.example.activity_tablet1;import android.os.Bundle;
      import android.view.LayoutInflater;
      import android.view.View;
      import android.view.ViewGroup;import androidx.fragment.app.Fragment;public class AnotherRightFragment extends Fragment {@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {View view = inflater.inflate(R.layout.another_right_fragment, container, false);return view;}
      }
    3. 实现碎片的添加替代功能:

      private void replaceFragment(Fragment fragment) {FragmentManager fragmentManager = getSupportFragmentManager();     //获取FragmentManager对象FragmentTransaction transaction = fragmentManager.beginTransaction(); //开启一个事务transaction.replace(R.id.right_layout, fragment);   //向容器中添加或者替换碎片transaction.commit(); //提交事物}
      

      动态添加碎片过程:

      1. 创建待添加的碎片实例。

      2. 获取FragmentManager,在活动中可以直接通过调用getSupportFragmentManager()方
        法得到。

      3. 开启一个事务,通过调用beginTransaction()方法开启。

      4. 向容器内添加或替换碎片,一般使用replace()方法实现,需要传人容器的id和待添加的碎片实例。

      5. 提交事务,调用commit()方法来完成。
        这样就完成了在活动中动态添加碎片的功能,重新运行程序,可以看到和之前相同的界面,
        然后点击一下按钮,效果如图4.6所示。

    4. 主活动中代码:

      package com.example.activity_tablet1;import androidx.appcompat.app.AppCompatActivity;
      import androidx.fragment.app.Fragment;
      import androidx.fragment.app.FragmentManager;
      import androidx.fragment.app.FragmentTransaction;import android.os.Bundle;
      import android.view.View;
      import android.widget.Button;public class MainActivity extends AppCompatActivity implements View.OnClickListener{@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Button button = (Button) findViewById(R.id.button);button.setOnClickListener(this);replaceFragment(new Right_fragment()); //加载初次显示碎片在左半边}@Overridepublic void onClick(View view) {switch (view.getId()) {case R.id.button:replaceFragment(new AnotherRightFragment());       //点击按钮后对左半边碎片进行更新替换break;default:break;}}private void replaceFragment(Fragment fragment) {FragmentManager fragmentManager = getSupportFragmentManager();FragmentTransaction transaction = fragmentManager.beginTransaction();transaction.replace(R.id.right_layout, fragment);transaction.commit();}
      }
      

4.2.3 在碎片中模拟回收栈

  1. 实现方法:

    FragmentTransaction 中提供了一个addToBackStack()方法,可以用于将一个
    事务添加到返回栈中,修改MainActivity中的代码,可实现按back时返回上层碎片的功能,类似活动跳转的返回过程。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0Qia7o3k-1627825748257)(C:\Users\过客\AppData\Roaming\Typora\typora-user-images\image-20210729162401224.png)]

4.2.4 碎片和活动之间进行通信

  1. 在活动中得到相应碎片的实例,FragmentManager 提供了一个类似于findViewById()
    的方法,专门用于从布局文件中获取碎片的实例,代码如下所示:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wglIvck2-1627825748260)(C:\Users\过客\AppData\Roaming\Typora\typora-user-images\image-20210729163537995.png)]

  2. 在碎片中获得活动,在每个碎片中都可以通过调用getActivity( )方法来得到和当前碎片相关联的活
    动实例,代码如下所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3aEJ0KC9-1627825748261)(C:\Users\过客\AppData\Roaming\Typora\typora-user-images\image-20210729164649051.png)]

4.3 碎片的生命周期

4.3.1 碎片的状态和回调

  1. 碎片的状态:

    1. 运行状态

      当一个碎片是可见的,并且它所关联的活动正处于运行状态时,该碎片也处于运行状态。

    2. 暂停状态

      当一个活动进人暂停状态时(由于另一个未占满屏幕的活动被添加到了栈顶),与它相关联的可见碎片就会进人到暂停状态。

    3. 停止状态

      当一个活动进入停止状态时,与它相关联的碎片就会进入到停止状态,或者通过调用
      FragmentTransaction的remove()、 replace()方法将碎片从活动中移除,但如果在事务提交之前调用addToBackStack()方法,这时的碎片也会进入到停止状态。总的来说,进人停止状态的碎片对用户来说是完全不可见的,有可能会被系统回收。

    4. 销毁状态

      碎片总是依附于活动而存在的,因此当活动被销毁时,与它相关联的碎片就会进人到销毁状态。或者通过调用FragmentTransaction 的remove() 、replace()方 法将碎片从活动中移除,但在事务提交之前并没有调用addToBackStack()方法,这时的碎片也会进人到销毁状态。

  2. 碎片几乎含有活动的所有回调方法,此外碎片还提供了一些附加的回调方法:

    1. onAttach()。当碎片和活动建立关联的时候调用。
    2. onCreateView()。为碎片创建视图(加载布局)时调用。
    3. onActivityCreated()。确保与碎片相关联的活动一定已经创建完毕的时候调用。
    4. onDestroyView()。当与碎片关联的视图被移除的时候调用。
    5. onDetach()。当碎片和活动解除关联的时候调用。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pj2UlIck-1627825748262)(C:\Users\过客\AppData\Roaming\Typora\typora-user-images\image-20210729170203558.png)]

4.3.2 体验碎片的生命周期

  1. 代码如下:

    package com.example.activity_tablet1;import android.content.Context;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;import androidx.annotation.NonNull;
    import androidx.annotation.Nullable;
    import androidx.fragment.app.Fragment;public class RightFragment extends Fragment {private static final String TAG = "RightFragment";@Overridepublic void onAttach(Context context) {super.onAttach(context);Log.d(TAG, "onAttach");}@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);Log.d(TAG, "onCreate");}@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {Log.d(TAG, "onCreateView");View view = inflater.inflate(R.layout.right_fragment, container, false);return view;}@Overridepublic void onActivityCreated(Bundle savedInstanceState) {super.onActivityCreated(savedInstanceState);Log.d(TAG, "onActivityCreated");}@Overridepublic void onResume() {super.onResume();Log.d(TAG, "onResume");}@Overridepublic void onPause() {super.onPause();Log.d(TAG, "onPause");}@Overridepublic void onStop() {super.onStop();Log.d(TAG, "onStop");}@Overridepublic void onDestroyView() {super.onDestroyView();Log.d(TAG, "onDestroyView");}@Overridepublic void onDestroy() {super.onDestroy();Log.d(TAG, "onDestroy");}
    }

    流程:

    1. 当RightFragment 第一次被加载到屏幕上时,会依次执行onAttach(),onCreate(),onCreateView(), onActivityCreated(),onStart ()和onResume()方法。

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SNtZXe2U-1627825748263)(C:\Users\过客\AppData\Roaming\Typora\typora-user-images\image-20210729172640311.png)]

    2. 点击LeftFragment中的按钮,由于AnotherRightFragment替换了RightFragment, 此时的RightFragment进入了停止状态
      因此onPause(),onStop( )和onDestroyView( )方法会得到执行。当然如果在替换的时候没有调用addToBackStack() 方法,此时的RightFragment 就会进人销毁状态,onDestroy()和
      onDetach()方法就会得到执行。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-howbB04h-1627825748263)(C:\Users\过客\AppData\Roaming\Typora\typora-user-images\image-20210729173039125.png)]

    1. 接着按下Back键,RightFragment 会重新回到屏幕,由于RightFragment 重新回到了运行状态,因此onActivityCreated()、 onStart ()和
      **onResume()**方法会得到执行。注意此时onCreate()和onCreateView()方法并不会执行,因为我们借助了addToBackStack()方法使得RightFragment和它的视图并没有销毁。

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tCrOkUL8-1627825748264)(C:\Users\过客\AppData\Roaming\Typora\typora-user-images\image-20210729173239642.png)]

    2. 再次按下Back键退出程序,依次会执行**onPause(),onStop(),onDestroyView(),onDestroy( )和onDetach()**方法,最终将活动和碎片一起销毁。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HxsdpG98-1627825748265)(C:\Users\过客\AppData\Roaming\Typora\typora-user-images\image-20210729173414208.png)]

4.4 动态加载布局的技巧

4.4.1 使用限定符

  1. 程序可以通过屏幕大小和限定符相匹配的模式为当前屏幕匹配最为合适的布局文件进行加载,文件夹后所跟的为此布局文件的限定符

    限定符:

    屏幕特性 限定符 描述
    大小 small 提供给小屏幕设备的资源
    大小 normal 提供给中等屏幕设备的资源
    大小 large 提供给大屏幕设备的资源
    大小 xlarge 提供给超大屏幕设备的资源
    分辨率 ldpi 提供给低分辨率设备的资源(120dpi以下)
    分辨率 mdpi 提供给中分辨率设备的资源(120dpi~160dpi)
    分辨率 hdpi 提供给高分辨率设备的资源(160dpi~240dpi)
    分辨率 xhdpi 提供给超高分辨率设备的资源(240dpi~320dpi)
    分辨率 xxhdpi 提供给超超高分辨率设备的资源(320dpi~480dpi)
    方向 land 提供给横屏设备的资源
    方向 port 提供给竖屏设备的资源

4.4.2 使用最小宽度限定符

  1. 使用:在res目录下新建layout-sw600dp文件夹,然后在这个文件夹下新建activity_ main.xml 布局,(swxxxdp,中间数字控制设备宽度,当设备宽度到达此宽度时就使用此布局)

    如:同一程序用手机打开为:(手机宽度未到达600dp,加载默认文件夹下activity_main布局)

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ck5bGlYs-1627825748265)(C:\Users\过客\AppData\Roaming\Typora\typora-user-images\image-20210729213237769.png)]

    使用平板打开为:(宽度大于600dp,加载layout-sw600dp文件夹下activity_main布局)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rnRPpwne-1627825748266)(C:\Users\过客\AppData\Roaming\Typora\typora-user-images\image-20210729213336504.png)]

4.5 碎片的最佳实践——一个简易版的新闻应用

  1. 设计两个布局,一个适用于平板等大屏设备,一个适用于手机等小屏设备

    1. 平板设计思路:左侧为新闻标题栏,右侧为新闻内容,点击左侧标题栏标题更新右侧内容栏的内容

      效果展示;

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Dh1PwShw-1627825748267)(C:\Users\过客\AppData\Roaming\Typora\typora-user-images\image-20210730162717555.png)]

    2. 手机设计思路:全屏自上而下显示新闻标题栏,点击标题栏进行页面跳转,跳转至新闻内容页面(活动的跳转)

      效果展示:

      标题栏:

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cGC30b3X-1627825748268)(C:\Users\过客\AppData\Roaming\Typora\typora-user-images\image-20210730163036520.png)]

      内容栏:

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aiteCG74-1627825748268)(C:\Users\过客\AppData\Roaming\Typora\typora-user-images\image-20210730163128011.png)]

  2. 创建News类用于存储新闻信息:

    package com.example.fragmentbestpractice;public class News {private String title;private String content;public String getTitle() {return title;}public String getContent() {return content;}public void setTitle(String title) {this.title = title;}public void setContent(String content) {this.content = content;}
    }
  3. 创建标题和内容栏碎片的布局文件:

    标题:(标题的控件为一个RecyclerView用于滚动显示标题)

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"><androidx.recyclerview.widget.RecyclerViewandroid:layout_width="match_parent"android:layout_height="match_parent"android:id="@+id/news_title_recycler_view"/></LinearLayout>
    

    内容:(布局里嵌套一个LinearLayout布局,此布局中放置两个TextView,一个用于显示标题,一个用于显示内容,两个View充当分割线)

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"><LinearLayoutandroid:id="@+id/visibility_layout"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"android:visibility="invisible"><TextViewandroid:id="@+id/news_title"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_gravity="center"android:padding="10dp"android:textSize="20sp" /><Viewandroid:layout_width="match_parent"android:layout_height="1dp"android:background="#000" /><TextViewandroid:id="@+id/news_content"android:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1"android:padding="15dp"android:textSize="18sp" /></LinearLayout><Viewandroid:layout_width="1dp"android:layout_height="match_parent"android:layout_alignParentStart="true"android:layout_alignParentLeft="true"android:background="#000" /></RelativeLayout>
    
  4. 创建两个碎片的加载类:

    标题:(适配器以内部类的形式设置在此类当中)

    package com.example.fragmentbestpractice;import android.os.Bundle;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.LinearLayout;
    import android.widget.TextView;import androidx.annotation.NonNull;
    import androidx.annotation.Nullable;
    import androidx.fragment.app.Fragment;
    import androidx.recyclerview.widget.LinearLayoutManager;
    import androidx.recyclerview.widget.RecyclerView;import java.util.ArrayList;
    import java.util.List;
    import java.util.Random;public class NewsTitleFragment extends Fragment {private boolean isTwoPane;@Nullable@Overridepublic View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {View view = inflater.inflate(R.layout.news_title_frag, container , false);   //动态加载碎片RecyclerView newsTitleRecyclerView = (RecyclerView) view.findViewById(R.id.news_title_recycler_view);LinearLayoutManager layoutManager =new LinearLayoutManager(getActivity());newsTitleRecyclerView.setLayoutManager(layoutManager);NewsAdapter adapter = new NewsAdapter(getNews());newsTitleRecyclerView.setAdapter(adapter);return view;}public List<News> getNews() { //初始化新闻内容信息List<News> newsList = new ArrayList<>();for(int i = 1 ; i <= 50; i++) {News news = new News();news.setTitle("This is title" + i);news.setContent(getRandomLengthContent("This is news content" + i + "."));newsList.add(news);}return newsList;}private String getRandomLengthContent(String content) {        //初始化新闻内容信息Random random = new Random();int length = random.nextInt(20) + 1;StringBuilder builder = new StringBuilder();for(int i = 0; i < length; i++) {builder.append(content);}return builder.toString();}@Overridepublic void onStart() {        //判断当前加载方式为单页加载还是双叶加载super.onStart();if(getActivity().findViewById(R.id.news_content_layout) != null) {isTwoPane = true;  //用于调整内容显示布局的可见性}else {isTwoPane = false;}}class NewsAdapter extends RecyclerView.Adapter<NewsAdapter.ViewHolder> {  //创建适配器内部类private List<News> mNewsList;class ViewHolder extends RecyclerView.ViewHolder {TextView newsTitleText;public ViewHolder(View view) {super(view);newsTitleText = (TextView) view.findViewById(R.id.news_title);}}public NewsAdapter(List<News> newsList) {mNewsList = newsList;}@NonNull@Overridepublic ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.news_item,parent,false);final ViewHolder Holder = new ViewHolder(view);view.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {News news = mNewsList.get(Holder.getAdapterPosition());if(isTwoPane) {  //是双叶显示就刷新内容布局,显示新闻内容NewsContentFragment newsContentFragment = (NewsContentFragment) getFragmentManager().findFragmentById(R.id.news_content_fragment);newsContentFragment.refresh(news.getTitle(), news.getContent());}else {  //不是则进行活动的跳转,进入下一活动进行新闻内容的显示NewsContentActivity.actionStart(getActivity(), news.getTitle(), news.getContent());}}});return Holder;}@Overridepublic void onBindViewHolder(@NonNull ViewHolder holder, int position) {News news = mNewsList.get(position);holder.newsTitleText.setText(news.getTitle());}@Overridepublic int getItemCount() {return mNewsList.size();}}
    }

    内容:

    package com.example.fragmentbestpractice;import android.os.Bundle;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.TextView;import androidx.annotation.NonNull;
    import androidx.annotation.Nullable;
    import androidx.fragment.app.Fragment;public class NewsContentFragment extends Fragment {private View view;@Nullable@Overridepublic View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {view = inflater.inflate(R.layout.news_content_frag, container, false);   //动态加载碎片return view;}public void refresh(String newsTitle, String newsContent) {    //刷新内容信息View visibilityLayout = view.findViewById(R.id.visibility_layout);visibilityLayout.setVisibility(View.VISIBLE);TextView newsTitleText = (TextView) view.findViewById(R.id.news_title);TextView newsContentText = (TextView) view.findViewById(R.id.news_content);newsContentText.setText(newsContent);newsTitleText.setText(newsTitle);}
    }
    
  5. 创建RecyclerView的子项布局:(为一个TextView布局)

    <?xml version="1.0" encoding="utf-8"?>
    <TextView xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="wrap_content"android:id="@+id/news_title"android:lines="1"android:ellipsize="end"android:textSize="18sp"android:paddingLeft="10dp"android:paddingRight="10dp"android:paddingTop="15dp"android:paddingBottom="15dp"/>
    
  6. 创建新闻内容布局将内容碎片加载进来用于单屏时显示,(活动跳转,跳转后则使用此布局)

    <?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="vertical"><fragmentandroid:layout_width="match_parent"android:layout_height="match_parent"android:name="com.example.fragmentbestpractice.NewsContentFragment"android:id="@+id/news_content_fragment"/></LinearLayout>
    
  7. 在默认主布局中加载标题碎片(小屏时使用此布局)

    <?xml version="1.0" encoding="utf-8"?>
    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="horizontal"><fragmentandroid:id="@+id/news_title_fragment"android:layout_width="match_parent"android:layout_height="match_parent"android:name="com.example.fragmentbestpractice.NewsTitleFragment"    //此碎片为标题/></FrameLayout>
    
  8. 在自定义大屏文件夹下的布局文件加载碎片(文件夹使用限定符—sw600dp表示当屏幕宽度超过600dp时使用该布局为主布局):

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="horizontal"android:layout_width="match_parent"android:layout_height="match_parent"><fragmentandroid:layout_width="0dp"android:layout_height="match_parent"android:id="@+id/news_title_fragment"    android:name="com.example.fragmentbestpractice.NewsTitleFragment"    //加载标题碎片,占比1/4android:layout_weight="1"/>  <FrameLayoutandroid:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="3" android:id="@+id/news_content_layout"><fragmentandroid:layout_width="match_parent"android:layout_height="match_parent"android:name="com.example.fragmentbestpractice.NewsContentFragment"       //加载内容suip,占比3/4android:id="@+id/news_content_fragment"/></FrameLayout></LinearLayout>
    
  9. 创建单屏点击标题时活动的跳转活动类

    package com.example.fragmentbestpractice;import androidx.appcompat.app.AppCompatActivity;import android.content.Context;
    import android.content.Intent;
    import android.os.Bundle;public class NewsContentActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.news_content);String newsTitle = getIntent().getStringExtra("news_title"); //获取上一活动传递的新闻信息String newsContent = getIntent().getStringExtra("news_content");NewsContentFragment newsContentFragment = (NewsContentFragment) getSupportFragmentManager().findFragmentById(R.id.news_content_fragment);    //活动中联系碎片,对碎片的信息进行更新newsContentFragment.refresh(newsTitle, newsContent);}public static void actionStart(Context context, String newsTitle, String newsContent) {     //在本活动创建上一活动向本活动传递信息的方法Intent intent = new Intent(context, NewsContentActivity.class);intent.putExtra("news_title", newsTitle);intent.putExtra("news_content", newsContent);context.startActivity(intent);}
    }
    

Android学习笔记(4)——探究碎片相关推荐

  1. Android:日常学习笔记(8)———探究UI开发(2)

    Android:日常学习笔记(8)---探究UI开发(2) 对话框 说明: 对话框是提示用户作出决定或输入额外信息的小窗口. 对话框不会填充屏幕,通常用于需要用户采取行动才能继续执行的模式事件. 提示 ...

  2. Android:日常学习笔记(6)——探究活动(3)

    Android:日常学习笔记(6)--探究活动(3) 活动的生命周期 返回栈 Android中的活动是可以叠加的,我们每启动一个新活动,就会覆盖在原来的活动上,点击Back以后销毁最上面的活动,下面的 ...

  3. Android:日常学习笔记(8)———探究UI开发(5)

    Android:日常学习笔记(8)---探究UI开发(5) ListView控件的使用 ListView概述 A view that shows items in a vertically scrol ...

  4. Android学习笔记:Android基础知识点(不断更新中)

    1.Android学习笔记:OkHttp 2.Android学习笔记:更新UI的方法(UI线程和非UI线程) 3.Android学习笔记:Volley 4.Android学习笔记:Handler 5. ...

  5. Android学习笔记21:ImageView获取网络图片

    Android平台有3种网络接口可以使用,它们分别是:java.net.*(标准java接口).org.apache(Apache接口)和android.net.*(Android网络接口).本文将使 ...

  6. Android学习笔记(七):多个Activity和Intent

    根据www.mars-droid.com:Andriod开发视频教学,先跳过书本<Beginning Android 2>的几个章,我是这两个资源一起看,需要进行一下同步.先初步了解一下应 ...

  7. Android学习笔记26:图片切换控件ImageSwitcher的使用

    在Windows操作系统中,要查看多张图片,可以通过使用"Windows照片查看器"在"上一张"和"下一张"之间切换,进行多张图片的浏览. ...

  8. Android学习笔记36:使用SQLite方式存储数据

    在Android中一共提供了5种数据存储方式,分别为: (1)Files:通过FileInputStream和FileOutputStream对文件进行操作.具体使用方法可以参阅博文<Andro ...

  9. Pro Android学习笔记(二九):用户界面和控制(17):include和merge

    xml控件代码重用:include 如果我们定义一个控件,需要在不同的layout中重复使用,或者在同一个layout中重复使用,可以采用include的方式.例如定义my_button.xml如下 ...

  10. Android学习笔记:TabHost 和 FragmentTabHost

    2019独角兽企业重金招聘Python工程师标准>>> Android学习笔记:TabHost 和 FragmentTabHostTabHost命名空间:android.widget ...

最新文章

  1. python 爬取网页照片!全代码!指定数量,指定目录,爬取过程详细!关于有下载照片过程但是不显示照片的问题的解释
  2. 编译选项_HarmonyOS编译过程
  3. 4.01~~Median
  4. mybatis查询时间段sql语句
  5. Java IO流之缓冲流
  6. 链式队列的基本操作(入队、出队、遍历队列、清空队列)
  7. Github上都没有的“网约车”项目,终于有人给写出来了!
  8. PC电脑端QQ如何适应电脑端大小
  9. 项目开发中自定义字段设计原则
  10. 【Codeforces Round #508 (Div. 2)】Slime【简单贪心】
  11. ktv娱乐收银系统java_美萍餐饮娱乐管理系统(歌厅管理软件,管理软件,收银系统,管理系统,娱乐收银软件)...
  12. qq服务器正在升级维护中,建议您稍后再尝试打开.谢谢!,用友通维护锦集
  13. 福利卡巴斯基一年免费以及一些使用软件
  14. Android 更换皮肤
  15. Spring IOC 学习总结
  16. 谷歌地图离线发布系列之偏移处理(三)纠偏算法
  17. 苹果手机蓝框一直跳动
  18. Mac电脑自动开机设置教程
  19. 【翻译】揭开HTML5的神秘面纱
  20. tf神经网络模型预测泰坦尼克号生还

热门文章

  1. 制作EDM 邮件规范
  2. 自制AI图像搜索引擎[笔记]
  3. 华为HarmonyOS鸿蒙系统介绍,华为鸿蒙OS系统怎么样 华为HarmonyOS鸿蒙系统介绍
  4. c语言周长和面积计算
  5. 个人爆发式成长的25种思维 | 筛选思维
  6. matlab偏最小二乘截距,matlab代写偏最小二乘回归(PLSR)和主成分回归(PCR)
  7. 电容的安装电感的计算公式
  8. # PPT进阶——文字环绕
  9. safari浏览器模拟ipone,ipad以及其他浏览器版本
  10. Linux修改和恢复服务器时间