Saturday, January 07, 2012

Galaxy NexusでFragment I

http://android-developers.blogspot.com/2011/02/android-30-fragments-api.html

上記サイトが一番ためになるようだ。
ただ、Layoutをxmlでやったり、Java内で動的にやったり、
なんだか関係がよくわからない、というレベルの私なので、
下記を参考にした。


おそらく一番わかり易い記事だ。


[PROCESS]

[#1 Make Project]
eclipseで新規作成メニューからAndroidプロジェクトを選択。
あなたの好きなプロジェクト名を作成する。

[#2 Configure main.xml]
さっき作ったプロジェクトで最初に動く画面を作るmain.xml。
どこにあるかは下記図を参照。これをダブルクリック。

これを下記に上書き。

  1. <linearlayout android:id="@+id/frags" android:layout_height="match_parent" android:layout_width="match_parent" android:orientation="horizontal" xmlns:android="http://schemas.android.com/apk/res/android">  
  2.   
  3.     <listview android:id="@+id/number_list" android:layout_height="match_parent" android:layout_width="250dip">  
  4.   
  5.     <fragment android:id="@+id/the_frag" android:layout_height="match_parent" android:layout_width="match_parent" class="com.bambooflower.fragmenttest.MyFragment">  
  6.   
  7. </fragment></listview></linearlayout>  
上書き編集画面はこんな感じ。


この"com.bambooflower.fragmenttest"はあなたの決めたプロジェクト名に変更。

[#3 Add codes to MainActivity]
こんどは、プロジェクトを仕切るActivityを書き換え。
プロジェクト名+Activityのファイルをダブルクリック。
クラス内にコードを追加。

  1.     @Override  
  2.     public void onCreate(Bundle savedInstanceState) {  
  3.         super.onCreate(savedInstanceState);  
  4.         setContentView(R.layout.main);  
  5.         ListView l = (ListView) findViewById(R.id.number_list);  
  6.         ArrayAdapter numbers = new ArrayAdapter<string>(getApplicationContext(),  
  7.                         android.R.layout.simple_list_item_1,   
  8.                         new String [] {  
  9.                 "one""two""three""four""five""six"  
  10.         });  
  11.         l.setAdapter(numbers);  
  12.         l.setOnItemClickListener(this);  
  13.     }  
  14.   
  15.       
  16.     /** 
  17.      * Add a Fragment to our stack with n Androids in it 
  18.      */  
  19.     private void stackAFragment(int nAndroids) {  
  20.         Fragment f = new MyFragment(nAndroids);  
  21.           
  22.         FragmentTransaction ft = getFragmentManager().beginTransaction();  
  23.         ft.replace(R.id.the_frag, f);  
  24.         ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);  
  25.         ft.addToBackStack(null);  
  26.         ft.commit();  
  27.     }  
  28.   
  29.         /** 
  30.          * Called when a number gets clicked 
  31.          */  
  32.         public void onItemClick(AdapterView parent, View view, int position, long id) {  
  33.                 stackAFragment(position + 1);  
  34.     }  
  35. </string>  



書き換え後はこんな感じ。

eclipse上で赤線が出てたら、依存関係が解消されていないので、
マウスオーバー(赤線の上にカーソルを合わせる)してサジェスト(カーソルの下に出てくる助言)野中の"import ****"を選択する。


[#4 Add Fragment Class]
プロジェクト名を右クリックして、クラスを追加する。

クラス名は、またあなたがつけてください。
クラス作成後のソースに下記を追加。


  1.  private int nAndroids;  
  2.    
  3.  public MyFragment() {  
  4.        
  5.  }  
  6.   
  7. /** 
  8.  * Constructor for being created explicitly 
  9.  */  
  10. public MyFragment(int nAndroids) {  
  11.              this.nAndroids = nAndroids;  
  12.  }  
  13.   
  14.  /** 
  15.   * If we are being created with saved state, restore our state 
  16.   */  
  17.  @Override  
  18.  public void onCreate(Bundle saved) {  
  19.      super.onCreate(saved);  
  20.      if (null != saved) {  
  21.              nAndroids = saved.getInt("nAndroids");  
  22.      }  
  23.  }  
  24.    
  25.  /** 
  26.   * Save the number of Androids to be displayed 
  27.   */  
  28.  @Override  
  29.  public void onSaveInstanceState(Bundle toSave) {  
  30.      toSave.putInt("nAndroids", nAndroids);  
  31.  }  
  32.   
  33.  /** 
  34.   * Make a grid and fill it with n Androids 
  35.   */  
  36.  @Override  
  37.  public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle saved) {  
  38.      int n;  
  39.      Context c = getActivity().getApplicationContext();  
  40.      LinearLayout l = new LinearLayout(c);  
  41.      for (n = 0; n < nAndroids; n++) {  
  42.              ImageView i = new ImageView(c);  
  43.              i.setImageResource(R.drawable.gallery_thumb);  
  44.              l.addView(i);  
  45.      }  
  46.      return l;  
  47.  }  
追加後はこんな感じ。

最後に、main.xmlにもどって、"MyFragment"と適当に私が入れていた名前を、あなたのクラス名にしてください。


[#5 build]
ビルドしてみましょう。
Android 4.0.3の横長画面エミュレータではこんな感じ。


Galaxy Nexusではこんな画面。なんか意図したものと違う・・・。
私が作りたいのは、Galaxy Nexusでは横に並ぶのではなく、画面遷移・・
そうかListViewもFragmentにしないといけないのかな。
次回はちゃんと画面遷移ができるようにするぞー!

No comments:

Post a Comment