android--(Fragments)

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

布局文件添加:
//定义两个fragment
//name : 引用继承fragment的子类

//在activity中创建两个fragment,将一个页面分为两块显示的内容
    <fragment
        android:layout_width="0dip"
        android:layout_height="match_parent"
        android:layout_weight="0.41"
        android:name="com.example.zhangjb.myapplication6.TitleFragment"
        android:id="@+id/title_fragment"
        ></fragment>


    <fragment
        android:layout_width="0dip"
        android:layout_height="match_parent"
        android:layout_weight="1.32"
        android:name="com.example.zhangjb.myapplication6.ContentFragment"
        android:id="@+id/content_fragment"
        ></fragment>
//再建立两个布局xml,这就是每个fragment里所要显示的内容


实例为布局xml,fragment子类:
public class TitleFragment extends Fragment {

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.title_layout,container,false);

        return view;
    }
}

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

public class ContentFragment extends Fragment {

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.content_layout, container, false);

        return view;
    }
}

activity类:在主activity中显示这两个fragment
public class MainActivity extends ActionBarActivity {
    TitleFragment titleFragment;
    ContentFragment contentFragment;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //通过 getFragmentManager(管理器获取fragment来获取实例)
        titleFragment = (TitleFragment) getFragmentManager().findFragmentById(R.id.title_fragment);
        contentFragment = (ContentFragment) getFragmentManager().findFragmentById(R.id.content_fragment);
    }
//代码添加的方式:
1.activity布局文件中:
    <fragment
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:id="@+id/title_fragment"
        android:layout_weight="1"
        android:name="com.example.zhangjb.myapplication6.TitleFragment"></fragment>



   <FrameLayout
       android:layout_width="0dp"
       android:layout_height="match_parent"
       android:id="@+id/content_layout"
       android:layout_weight="3"

       ></FrameLayout>

2.在activity中利用代码将其它的fragment添加到指定的布局组件中
public class MainActivity2Activity extends Activity {

    ContentFragment contentFragment;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main_activity2);

        addContentLayout();

    }


    /***
     *
     * 通过代码添加Fragment
     *
     * @param
     */

    private  void addContentLayout(){
        FragmentManager fm = getFragmentManager();
        //开启一个事务
        FragmentTransaction ft = fm.beginTransaction();

//创建fragment实例对象
        contentFragment = new ContentFragment();

        //添加fragment到指定布局的中中显示
        ft.add(R.id.content_layout,contentFragment);

        //ft.remove(); 删除
        //ft.replace(); 替换

        Log.i("Layout","添加frament");

        ft.commit();//提交事务

    }
}

这里写图片描述

//新建一个activity
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="one"
        android:id="@+id/button4"
        android:layout_below="@+id/textView2"
        android:layout_alignParentStart="true"
        android:onClick="oneClick"
        />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="two"
        android:id="@+id/button5"
        android:layout_below="@+id/textView2"
        android:layout_alignParentEnd="true"
        android:layout_marginEnd="25dp"
        android:onClick="twoClick"

        />

    <FrameLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_below="@+id/button4"
        android:layout_alignParentEnd="true"
        android:layout_alignParentBottom="true"
        android:layout_alignParentStart="true"

        android:id="@+id/content"
      ></FrameLayout>


2.activity类:
public class PopBackTaskActivity extends ActionBarActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_pop_back_task);
    }


///当单击的时候显示不同的fragment内容
    public void oneClick(View v){

        PopBackFragment p1 = new PopBackFragment("two");

       FragmentTransaction ft =  getFragmentManager().beginTransaction();


        ft.replace(R.id.content,p1);

        //把当前fragment添加到Activity栈中
        ft.addToBackStack(null);

        ft.commit();



    }


    public  void  twoClick(View v){

        PopBackFragment p2 = new PopBackFragment("one");//创建fragment类

//开启事务
        FragmentTransaction ft =  getFragmentManager().beginTransaction();


//替换activity中的组件,
//参数:要替换的id, fragment组件(这里通过代码的方式来添加fragment组件)
        ft.replace(R.id.content,p2);

        //把当前fragment添加到Activity栈中
        ft.addToBackStack(null);

        ft.commit();

    }


    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if(keyCode == KeyEvent.KEYCODE_BACK){
            if(getFragmentManager().getBackStackEntryCount() == 0){
                finish();
            }else {
                getFragmentManager().popBackStack();//出栈的动作
            }

           return  true;

        }

        return super.onKeyDown(keyCode,event);


    }


}

//鼠标右键创建一个空白frament,会自动生成继承fragment类和xml文件
public class PopBackFragment extends Fragment {

    String title;

    public PopBackFragment() {

    }

    public PopBackFragment(String title){//传入字符,用于区分不同的显示
        this.title = title;
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {


        View view =  inflater.inflate(R.layout.fragment_pop_back, container, false);

//获取布局中的textView组件
         TextView tx = (TextView) view.findViewById(R.id.textViw_text);

//设置字符串
        tx.setText(title);
        return view;
    }


}
优化上面的方法:原因:fragment传参问题,上面的结果导致手机屏幕旋转时,frangment会丢失传入的参数

public class PopBackFragment extends Fragment {

    public PopBackFragment() {

    }
    //正确的给 fragment传递参数
    public static PopBackFragment getInstance(String title){
        PopBackFragment p = new PopBackFragment();

        Bundle bundle = new Bundle();
        bundle.putString("title",title);

        p.setArguments(bundle);//保存传入的参数

        return  p;
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view =  inflater.inflate(R.layout.fragment_pop_back, container, false);

         TextView tx = (TextView) view.findViewById(R.id.textViw_text);

        tx.setText(getArguments().getString("title"));
        return view;
    }
}


public class PopBackTaskActivity extends ActionBarActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_pop_back_task);
    }

    public void oneClick(View v){

        PopBackFragment p1 =PopBackFragment.getInstance("one");

       FragmentTransaction ft =  getFragmentManager().beginTransaction();

        ft.replace(R.id.content,p1);

        //把当前fragment添加到Activity栈中
        ft.addToBackStack(null);

        ft.commit();

    }


    public  void  twoClick(View v){

        PopBackFragment p2 = PopBackFragment.getInstance("two");

        FragmentTransaction ft =  getFragmentManager().beginTransaction();
        ft.replace(R.id.content,p2);

        //把当前fragment添加到Activity栈中
        ft.addToBackStack(null);

        ft.commit();

    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if(keyCode == KeyEvent.KEYCODE_BACK){
            if(getFragmentManager().getBackStackEntryCount() == 0){
                finish();
            }else {
                getFragmentManager().popBackStack();//出栈的动作
            }
           return  true;
        }
        return super.onKeyDown(keyCode,event);
    }
}

这里写图片描述

这里写图片描述

//fragment与activity之间的交互

1.创建两个 fragment
<Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="新闻"
        android:id="@+id/button1"

        />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="音乐"
        android:id="@+id/button2"
        android:layout_gravity="left|top"

        />

-------------------------
    <TextView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/value"

        android:text="no data"

        android:layout_gravity="center"
        />

----fragment事件源中创建一个回调接口,得到activity并调用实现接口的方法-------

public class MainFragment extends Fragment implements View.OnClickListener {

    private  MainLister mainLister;


    public MainFragment() {
        // Required empty public constructor
    }


    //获取activity,也就是宿主
    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        mainLister = (MainLister) activity;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View V =  inflater.inflate(R.layout.fragment_main, container, false);

        V.findViewById(R.id.button1).setOnClickListener(this);
        V.findViewById(R.id.button2).setOnClickListener(this);

        return V;
    }


    //单击按钮更新另一个fragment中的值,fragment之间产生交互
    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.button1:
                mainLister.changeValue("news");
            break;
            case R.id.button2:
                mainLister.changeValue("music");
            break;
        }
    }


    //定义一个回调接口
    public static interface MainLister{
        public void changeValue(String value);
    }
}
------要改变的fragmen---------
public class MentFragment extends Fragment {

    private TextView textView_value;

    public MentFragment() {
        // Required empty public constructor
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        View v =  inflater.inflate(R.layout.fragment_ment, container, false);

        textView_value= (TextView) v.findViewById(R.id.value);

        return v;

    }

    public  void changeTextValue(String value){
        textView_value.setText(value);
    }

}

---------activity,并实现接口------------

public class MainActivity extends ActionBarActivity implements MainFragment.MainLister {

    private MentFragment mentFragment;
    private MainFragment mainFragment;



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //获取两个fragment对象
        mainFragment = (MainFragment) getFragmentManager().findFragmentById(R.id.main);
        mentFragment = (MentFragment) getFragmentManager().findFragmentById(R.id.ment);
    }



    @Override
    public void changeValue(String value) {
        mentFragment.changeTextValue(value);
    }
}

这里写图片描述

1.新建 activity:

    <fragment
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/perfs_fragment"
        android:name="com.example.zhangjb.myapplication3.PrefsFragment"
    ></fragment>


public class MainActivity2Activity extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main_activity2);


       SharedPreferences sp =  PreferenceManager.getDefaultSharedPreferences(this);

       String name  =  sp.getString("checkbox_preference","");

        Log.i("msg",name);

    }


}

2.新建xml:文件名:preferences.xml
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">

    <PreferenceCategory
        android:title="打开声音">

        <CheckBoxPreference
            android:key="checkbox_preference"
            android:title="打开"
            android:summary="声音设置" />

    </PreferenceCategory>

    <PreferenceCategory
        android:title="城市">

        <EditTextPreference
            android:key="edittext_preference"
            android:title="城市名称"
            android:summary="请输入城市"
            android:dialogTitle="城市标题" />

        <ListPreference
            android:key="list_preference"
            android:title="城市名称1"
            android:summary="请选择城市名称"
            android:entries="@array/city"
            android:entryValues="@array/city"
            android:dialogTitle="城市名称" />

    </PreferenceCategory>
</PreferenceScreen>

3.新建fragemnt:
public class PrefsFragment extends PreferenceFragment {


    @Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        //加载Preferences.xml文件
        addPreferencesFromResource(R.xml.preferences);

    }
}

这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值