Android(安卓)Fragment学习笔记(二)
16lz
2021-01-26
Note:本例有两个Fragment,并且Fragment之间能够进行通信,每当点击左边fragment的item时,都会在右边的fragment中显示对应的内容。需要整个工程的请到我的资源里下载fragmentlayou123.
本程序涉及3个.java文件:Fragmentlayout123Activity.java、DetailsFragment.java、TitleFragment.java。其中各个部分的功能如下:
1、在Fragmentlayout123Activity.java中,设置了fragment_layout布局,并建了一个DetailsActivity,用在手机上显示。
public class Fragmentlayout123Activity extends Activity { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.fragment_layout); } /** * This is a secondary activity, to show what the user has selected * when the screen is not large enough to show it all in one activity. */ public class DetailsActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { // If the screen is now in landscape mode, we can show the // dialog in-line with the list so we don't need this activity. finish(); return; } if (savedInstanceState == null) { // During initial setup, plug in the details fragment. DetailsFragment details = new DetailsFragment(); details.setArguments(getIntent().getExtras()); getFragmentManager().beginTransaction().add(android.R.id.content, details).commit(); } } }}
2、在DetailsFragment.java中,方法newInstance用于新建一个DetailFragment,onCreateView用来产生DetailFragment的View。
public class DetailsFragment extends Fragment {/**Create a new instance of DetailsFragment, initialized to show the text at 'index'.*/public static DetailsFragment newInstance(int index) {DetailsFragment f = new DetailsFragment();// Supply index input as an argument.Bundle args = new Bundle();args.putInt("index", index);//给Fragment初始化参数f.setArguments(args);return f;}public int getShownIndex() {return getArguments().getInt("index", 0);}@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {if (container == null) {// We have different layouts, and in one of them this// fragment's containing frame doesn't exist. The fragment// may still be created from its saved state, but there is// no reason to try to create its view hierarchy because it// won't be displayed. Note this is not needed -- we could// just run the code below, where we would create and return// the view hierarchy; it would just never be used.return null;}ScrollView scroller = new ScrollView(getActivity());TextView text = new TextView(getActivity());int padding = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 4, getActivity().getResources().getDisplayMetrics());// hetao:设置边框大小text.setPadding(padding, padding, padding, padding);scroller.addView(text);text.setText(DIALOGUE[getShownIndex()]);return scroller;}public static final String[] DIALOGUE = {"So shaken as we are, so wan with care,"+ "In forwarding this dear expedience.","Hear him but reason in divinity,"+ "From open haunts and popularity.","I come no more to make you laugh: things now,"+ "A man may weep upon his wedding-day.","First, heaven be the record to my speech!"+ "What my tongue speaks my right drawn sword may prove.","Now is the winter of our discontent"+ "Clarence comes.","To bait fish withal: if it will feed nothing else,"+ "will better the instruction.","Virtue! a fig! 'tis in ourselves that we are thus"+ "you call love to be a sect or scion.","Blow, winds, and crack your cheeks! rage! blow!"};public static final String[] TITLES = { "Henry IV (1)", "Henry V","Henry VIII", "Richard II", "Richard III", "Merchant of Venice","Othello", "King Lear" };}
3、在TitleFragment.java中,onActivityCreated用来初始化TitleFragment,showDetails用来显示选中Item的内容。
public class TitlesFragment extends ListFragment { boolean mDualPane;//检验是否有DetailFragment,没有就另起一个activity int mCurCheckPosition = 0; @Override //初始化TitleFragment public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); // Populate list with our static array of titles. setListAdapter(new ArrayAdapter(getActivity(), android.R.layout.simple_list_item_activated_1, TITLES)); // Check to see if we have a frame in which to embed the details // fragment directly in the containing UI. View detailsFrame = getActivity().findViewById(R.id.details); mDualPane = detailsFrame != null && detailsFrame.getVisibility() == View.VISIBLE; if (savedInstanceState != null) { // Restore last state for checked position. mCurCheckPosition = savedInstanceState.getInt("curChoice", 0); } if (mDualPane) { // In dual-pane mode, the list view highlights the selected item. getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE); // Make sure our UI is in the correct state. showDetails(mCurCheckPosition); } } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putInt("curChoice", mCurCheckPosition); } @Override public void onListItemClick(ListView l, View v, int position, long id) { showDetails(position); } /** * Helper function to show the details of a selected item, either by * displaying a fragment in-place in the current UI, or starting a * whole new activity in which it is displayed. */ void showDetails(int index) { mCurCheckPosition = index; if (mDualPane) { // We can display everything in-place with fragments, so update // the list to highlight the selected item and show the data. getListView().setItemChecked(index, true); // Check what fragment is currently shown, replace if needed. DetailsFragment details = (DetailsFragment) getFragmentManager().findFragmentById(R.id.details); if (details == null || details.getShownIndex() != index) { details = DetailsFragment.newInstance(index); // Execute a transaction, replacing any existing fragment // with this one inside the frame. FragmentTransaction ft = getFragmentManager().beginTransaction(); ft.replace(R.id.details, details); ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); ft.commit(); } } else { // Otherwise we need to launch a new activity to display // the dialog fragment with selected text. Intent intent = new Intent(); intent.setClass(getActivity(), DetailsActivity.class); intent.putExtra("index", index); startActivity(intent); } } //copied by hetao public static final String[] TITLES = { "Henry IV (1)", "Henry V", "Henry VIII", "Richard II", "Richard III", "Merchant of Venice", "Othello", "King Lear" };}
其中还涉及到一个布局文件fragment_layout.xml
更多相关文章
- 多种方式实现Android页面布局的切换
- Android(安卓)MMS/SMS 入口
- android关于popupWindow不显示
- Android(安卓)Studio 布局文件格式化代码
- Android(安卓)图片处理 之 Bitmap
- 3.addView调用之后导致子布局的android:layout_width="match_par
- Android(安卓)ConstraintLayout布局详解
- Android加载长图之Scrollview嵌套ImageView
- Android(安卓)用户界面(User Interface)