liguofeng29’s blog

個人勉強用ブログだっす。

AndroidのFragment - Fragment生成&Activityとの通信

サンプル概要


Activityは二つのFragment

1. BookListFragment      - 本リストを表示する

2. BookDetailFragment  - 本の詳細を表示する

を含み、本をクリックした際にその詳細が表示される。

 

作成手順


① BookContent(Bookモデル含む)を作成する

② BookDetailFragmentを作成する

③ BookListFragmentを作成する

④ MainActivityを作成する

 

 

サンプル


① BookContent(Bookモデル含む)を作成する

BookContent.java
 
package com.example.liguofeng.fragmentsample.model;

import java.util.ArrayList;
import java.util.List;

public class BookContent {
public static List<Book> bookList = new ArrayList<Book>(){
{add(new Book(0, "java", "java is a programming laguage. made by SunMicrosoft."));}
{add(new Book(1, "android", "android is a flatform. made by Google."));}
{add(new Book(2, "c#", "c# is a programming laguage. made by MS."));}
{add(new Book(3, "spring", "spring is a framework fro wepapp."));}
};

// Bookクラス
public static class Book {
public Integer id;
public String title;
public String desc;

public Book(Integer id, String title, String desc) {
this.id = id;
this.title = title;
this.desc = desc;
}

@Override
public String toString() {
return title;
}
}
}

 

② BookDetailFragmentを作成する

BookDetailFragment.java
 
package com.example.liguofeng.fragmentsample.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.liguofeng.fragmentsample.R;
import com.example.liguofeng.fragmentsample.model.BookContent;

public class BookDetailFragment extends Fragment {
public static final String ITEM_ID = "item_id";

BookContent.Book book; // 表示BOOK
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

if (getArguments().containsKey(ITEM_ID)) {
// Bookを取得する
book = BookContent.bookList.get(getArguments().getInt(ITEM_ID));
}
}

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

// layoutファイルロード
View rootView = inflater.inflate(R.layout.fragment_book_detail, container, false);

if (book != null) {
// タイトル表示
((TextView) rootView.findViewById(R.id.book_title)).setText(book.title);
// 説明表示
((TextView) rootView.findViewById(R.id.book_desc)).setText(book.desc);
}

return rootView; // View返却
}
}

 

 
fragment_book_detail.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="vertical">
<!-- Book Title -->
<TextView
style="?android:attr/textAppearanceLarge"
android:id="@+id/book_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="16dp"/>
<!-- Book desc -->
<TextView
style="?android:attr/textAppearanceMedium"
android:id="@+id/book_desc"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="16dp"/>
</LinearLayout>

 

BookListFragmentを作成する

 

BookListFragment.java
 
package com.example.liguofeng.fragmentsample.fragment;

import android.app.Activity;
import android.app.ListFragment;

import android.os.Bundle;

import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;


import com.example.liguofeng.fragmentsample.model.BookContent;

// ListFragmentの継承する場合、onCreateVieメソッドをオーバライドする必要がない
public class BookListFragment extends ListFragment {

Callback mCallback; // Activityと通信用Callback
public interface Callback {
public void onItemSelected(Integer id);
}

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

setListAdapter(new ArrayAdapter<BookContent.Book>(getActivity(),
android.R.layout.simple_list_item_activated_1,
// ※ 対象オブジェクトのtoString()を表示する!!!ハマってた!!!
android.R.id.text1,
BookContent.bookList));
}

// Deprecatedされているが、理由か下記参照
// http://qiita.com/syarihu/items/a8bb189d33585238c287
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);

if (!(activity instanceof Callback)) {
// ActivityがCallbacksを実装してない場合、サンプルなの無視
}

mCallback = (Callback) activity;
}

@Override
public void onDetach() {
super.onDetach();
mCallback = null;
}

@Override
public void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
mCallback.onItemSelected(BookContent.bookList.get(position).id);
}

public void setActivityOnItemClick(boolean activateOnItemClick) {
getListView().setChoiceMode(
activateOnItemClick ?
ListView.CHOICE_MODE_SINGLE : ListView.CHOICE_MODE_NONE
);
}
}

 

④ MainActivityを作成する

activity_book_twopane.xml
 
<?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"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
android:divider="?android:attr/dividerHorizontal"
android:showDividers="middle">
<!-- add Fragment -->
<fragment
android:name="com.example.liguofeng.fragmentsample.fragment.BookListFragment"
android:id="@+id/book_list"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1" />
<!-- add FrameLayout-->
<FrameLayout
android:id="@+id/book_detail_container"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="3" />
</LinearLayout>
 
MainActivity.java
 
package com.example.liguofeng.fragmentsample;

import android.app.Activity;
import android.app.FragmentManager;
import android.support.annotation.BoolRes;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Toast;

import com.example.liguofeng.fragmentsample.fragment.BookDetailFragment;
import com.example.liguofeng.fragmentsample.fragment.BookListFragment;

public class MainActivity extends Activity implements BookListFragment.Callback{

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_book_twopane);
}
// callbakc実装
@Override
public void onItemSelected(Integer id) {

// パラメタ生成
Bundle data = new Bundle();
data.putInt(BookDetailFragment.ITEM_ID, id);
// Fragment生成
BookDetailFragment fragment = new BookDetailFragment();
// パラメータ設定
fragment.setArguments(data);
// Fragmentを表示
getFragmentManager()
.beginTransaction()
.replace(R.id.book_detail_container, fragment)
.commit();
}
}