Android Fragment 真正的完全解析(5)

import android.app.Activity;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.util.Log;
import android.view.Window;

public class MainActivity extends Activity

{
 private static final String TAG = "FragmentOne";
 private FragmentOne mFOne;

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

Log.e(TAG, savedInstanceState+"");
 
  if(savedInstanceState == null)
  {
   mFOne = new FragmentOne();
   FragmentManager fm = getFragmentManager();
   FragmentTransaction tx = fm.beginTransaction();
   tx.add(R.id.id_content, mFOne, "ONE");
   tx.commit();
  }
 
 

}

}

现在无论进行多次旋转都只会有一个Fragment实例在Activity中。

现在还存在一个问题,就是重新绘制时,Fragment发生重建,原本的数据如何保持?

其实和Activity类似,Fragment也有onSaveInstanceState的方法,在此方法中进行保存数据,然后在onCreate或者onCreateView或者onActivityCreated进行恢复都可以。

由于篇幅原因,就不贴测试代码了。

5、Fragmeny与ActionBar和MenuItem集成

Fragment可以添加自己的MenuItem到Activity的ActionBar或者可选菜单中。

a、在Fragment的onCreate中调用setHasOptionsMenu(true);

b、然后在Fragment子类中实现onCreateOptionsMenu

c、如果希望在Fragment中处理MenuItem的点击,也可以实现onOptionsItemSelected;当然了Activity也可以直接处理该MenuItem的点击事件。

代码:

Fragment

package com.zhy.zhy_fragments;

import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;

public class FragmentOne extends Fragment
{

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

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

@Override
 public void onCreateOptionsMenu(Menu menu, MenuInflater inflater)
 {
  inflater.inflate(R.menu.fragment_menu, menu);
 }

@Override
 public boolean onOptionsItemSelected(MenuItem item)
 {
  switch (item.getItemId())
  {
  case R.id.id_menu_fra_test:
   Toast.makeText(getActivity(), "FragmentMenuItem1", Toast.LENGTH_SHORT).show();
   break;
  }
  return true;
 }

}

Activity

package com.zhy.zhy_fragments;

import android.app.Activity;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.Window;
import android.widget.Toast;

public class MainActivity extends Activity

{
 private static final String TAG = "FragmentOne";
 private FragmentOne mFOne;

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

Log.e(TAG, savedInstanceState + "");

if (savedInstanceState == null)
  {
   mFOne = new FragmentOne();
   FragmentManager fm = getFragmentManager();
   FragmentTransaction tx = fm.beginTransaction();
   tx.add(R.id.id_content, mFOne, "ONE");
   tx.commit();
  }

}

@Override
 public boolean onCreateOptionsMenu(Menu menu)
 {
  super.onCreateOptionsMenu(menu);
  getMenuInflater().inflate(R.menu.main, menu);
  return true;
 }

@Override
 public boolean onOptionsItemSelected(MenuItem item)
 {
  switch (item.getItemId())
  {
  case R.id.action_settings:
   Toast.makeText(this, "setting", Toast.LENGTH_SHORT).show();
   return true;
  default:
   //如果希望Fragment自己处理MenuItem点击事件,一定不要忘了调用super.xxx
   return super.onOptionsItemSelected(item);
  }
 }

}

效果图:

好了,可以很好的看到,Fragment可以添加MenuItem,也可以自己处理点击~~~

6、没有布局的Fragment的作用

没有布局文件Fragment实际上是为了保存,当Activity重启时,保存大量数据准备的

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/3bd7bf90a93a91ebdc36edcde2b1c4df.html