Android学習の道-Fragmentの2


前編では、Fragmentの静的および動的追加の簡単な使用、およびライフサイクルについて学習しました.fragmentをよりよく理解し、使用するために、このセクションでは、実際の応用と結びつけて、fragmentとactivityの間、およびfragmentとの間のインタラクションを共有します.
1、fragmentはactivityと対話する.
Activityはfragmentにパラメータを渡します.
トランザクションインスタンス化fragmentのコミット時にパラメータをfragmentに渡し、newInstance()メソッドでカラーマップsetArguments()を呼び出してパラメータを保存します.
oncreate()メソッドでgetAraguments()パラメータを取り出して使用します.
fragmentはactivityにパラメータを渡します.
これはインタフェースコールバックメカニズムを採用し、fragmentでインタラクティブインタフェースを定義し、activityにインタフェース、fragmentライフサイクルを実現させる.
onAttach(Activity activity) activity , , activity。

例:
効果図から分かるように、左はfragmentの中にlistViewが入っていて、ItemをクリックするとActivityにパラメータを渡すことができ、Activityはパラメータを受信した後、条件によって右の対応するframgentを置き換えると判断します.パラメータを置換fragmentに渡します.
左のfragemnt:xmlファイル:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="fragment_demo.fragment.FragmentTwo"
    android:background="@android:color/holo_blue_bright">

    <ListView
        android:id="@+id/fragment_listview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

</FrameLayout>
package fragment_demo.fragment;


import android.app.Activity;
import android.app.Fragment;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import com.example.call.R;

/**
 * A simple {@link Fragment} subclass.
 */
public class FragmentTwo extends Fragment implements AdapterView.OnItemClickListener {


    private ListView mListView;
    private String[] data = new String[]{" ", " ", " "};
    private OnCallBackInter mOnCallBackInter;
    /* Activity */
    public interface OnCallBackInter{
        public void OngetMsg(String msg);
    }

    @Override
    /* */
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        mOnCallBackInter = (OnCallBackInter)activity;   // 
    }

    /* Fragment */
    public static FragmentTwo newInstance(){
        FragmentTwo fragmentTwo = new FragmentTwo();
        return fragmentTwo;
    }

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

        View v = inflater.inflate(R.layout.fragment_fragment_two_layout, container, false);
        mListView = (ListView) v.findViewById(R.id.fragment_listview);
        FragmentListAdapter adapter = new FragmentListAdapter(getActivity());
        adapter.setDataStr(data);
        mListView.setAdapter(adapter);
        mListView.setOnItemClickListener(this);
        return v;
    }

    @Override
    public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
        String str = (String) adapterView.getAdapter().getItem(i);
        Toast.makeText(getActivity(), str, Toast.LENGTH_SHORT).show();
        mOnCallBackInter.OngetMsg(str);   // Activity
    }


    public class FragmentListAdapter extends BaseAdapter {
        private String[] dataStr = new String[]{};
        private LayoutInflater inflater;
        public FragmentListAdapter(Context context) {
            this.inflater = LayoutInflater.from(context);
        }

        public void setDataStr(String[] data) {
            this.dataStr = data;
            notifyDataSetChanged();
        }

        @Override
        public int getCount() {
            return dataStr.length;
        }

        @Override
        public Object getItem(int i) {
            return dataStr[i];
        }

        @Override
        public long getItemId(int i) {
            return i;
        }

        @Override
        public View getView(int i, View view, ViewGroup viewGroup) {
            if (view == null) {
                view = inflater.inflate(android.R.layout.simple_list_item_1, null);
            }
            TextView txt = (TextView) view;
            txt.setText((CharSequence) getItem(i));
            return view;
        }

    }

}
fragmentでactivityにパラメータを渡すのは、インタフェースコールバックによって実現される.
右の3つのfragmentはほぼ同じで、ここでは1つを貼り付けます.
xmlレイアウト:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/holo_red_light">

    <!-- TODO: Update blank fragment layout -->
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text=" Fragment"
        android:textSize="20sp"
        android:layout_centerInParent="true"/>

    <TextView
        android:id="@+id/movies_fragment_txt"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="20sp"
        android:layout_alignParentBottom="true"/>

</RelativeLayout>

JAvaコード:
package fragment_demo.fragment;


import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import com.example.call.R;

/**
 * A simple {@link Fragment} subclass.
 */
public class MoviesFragment extends Fragment {
    private static final String ARG_PARAM1 = "param1";
    private String mParam1;

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

    public static MoviesFragment newInstance(String str){
        MoviesFragment fragment = new MoviesFragment();
        Bundle bundle = new Bundle();
        bundle.putString(ARG_PARAM1,str);
        fragment.setArguments(bundle);
        return fragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if(getArguments() != null){
            mParam1 = getArguments().getString(ARG_PARAM1);
        }
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View v = inflater.inflate(R.layout.fragment_movies_layout, container, false);
        TextView txt = (TextView) v.findViewById(R.id.movies_fragment_txt);
        txt.setText(mParam1);
        return v;
    }

}

ActivityからFragmentへの参照は比較的簡単で,ライフサイクル対応メソッドに対応コードを書けばよいことが分かる.
最後にMainActivityでどんな判断をしたか見てみましょう.
MainActivity XMLレイアウト:
<?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">

    <FrameLayout
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:id="@+id/fragment_title_frameLayout"/>

    <FrameLayout
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="2"
        android:id="@+id/fragment_content_framentlayout">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/fragment_showTxt"
            android:layout_gravity="center"
            android:background="@android:color/holo_purple"/>
    </FrameLayout>

</LinearLayout>

JAvaコード:
package fragment_demo.fragment;

import android.app.Activity;
import android.app.FragmentManager;
import android.os.Bundle;
import android.widget.TextView;

import com.example.call.R;

public class FragmentMainActivity extends Activity implements FragmentTwo.OnCallBackInter {
    private TextView mShowTxt;
    private FragmentManager manager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_fragment_main_layout);
        mShowTxt = (TextView) findViewById(R.id.fragment_showTxt);
        manager = getFragmentManager();

        manager.beginTransaction().add(R.id.fragment_title_frameLayout, FragmentTwo.newInstance()).commit();

        /* , Fragment OnAttach() */
    }

    @Override
    /* */
    public void OngetMsg(String msg) {
       if(msg.equals(" ")) {
           manager.beginTransaction().replace(R.id.fragment_content_framentlayout, NewsFragment.newInstance(msg)).commit();
       }else if (msg.equals(" ")){
            manager.beginTransaction().replace(R.id.fragment_content_framentlayout,MoviesFragment.newInstance(msg)).commit();
       }else if (msg.equals(" ")){
           manager.beginTransaction().replace(R.id.fragment_content_framentlayout,TravealFragment.newIntance(msg)).commit();
       }


    }
}

最後に上記の効果を実現しました.