Android学習の道-Fragmentの2
9651 ワード
前編では、Fragmentの静的および動的追加の簡単な使用、およびライフサイクルについて学習しました.fragmentをよりよく理解し、使用するために、このセクションでは、実際の応用と結びつけて、fragmentとactivityの間、およびfragmentとの間のインタラクションを共有します.
1、fragmentはactivityと対話する.
Activityはfragmentにパラメータを渡します.
トランザクションインスタンス化fragmentのコミット時にパラメータをfragmentに渡し、newInstance()メソッドでカラーマップsetArguments()を呼び出してパラメータを保存します.
oncreate()メソッドでgetAraguments()パラメータを取り出して使用します.
fragmentはactivityにパラメータを渡します.
これはインタフェースコールバックメカニズムを採用し、fragmentでインタラクティブインタフェースを定義し、activityにインタフェース、fragmentライフサイクルを実現させる.
例:
効果図から分かるように、左はfragmentの中にlistViewが入っていて、ItemをクリックするとActivityにパラメータを渡すことができ、Activityはパラメータを受信した後、条件によって右の対応するframgentを置き換えると判断します.パラメータを置換fragmentに渡します.
左のfragemnt:xmlファイル:
右の3つのfragmentはほぼ同じで、ここでは1つを貼り付けます.
xmlレイアウト:
JAvaコード:
ActivityからFragmentへの参照は比較的簡単で,ライフサイクル対応メソッドに対応コードを書けばよいことが分かる.
最後にMainActivityでどんな判断をしたか見てみましょう.
MainActivity XMLレイアウト:
JAvaコード:
最後に上記の効果を実現しました.
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();
}
}
}
最後に上記の効果を実現しました.