DetailsFragment.java revision 76c3b90228d8c4afc6d24c683e9c95f41ae619c9
1/* 2 * Copyright (C) 2014 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 5 * in compliance with the License. You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software distributed under the License 10 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 11 * or implied. See the License for the specific language governing permissions and limitations under 12 * the License. 13 */ 14package android.support.v17.leanback.app; 15 16import android.support.v17.leanback.R; 17import android.support.v17.leanback.widget.ObjectAdapter; 18import android.support.v17.leanback.widget.OnItemClickedListener; 19import android.support.v17.leanback.widget.OnItemSelectedListener; 20import android.support.v17.leanback.widget.Row; 21import android.support.v17.leanback.widget.VerticalGridView; 22import android.app.Fragment; 23import android.os.Bundle; 24import android.view.LayoutInflater; 25import android.view.View; 26import android.view.ViewGroup; 27 28/** 29 * Wrapper fragment for leanback details screens. 30 */ 31public class DetailsFragment extends Fragment { 32 private static final String TAG = "DetailsFragment"; 33 private static boolean DEBUG = false; 34 35 private RowsFragment mRowsFragment; 36 37 private ObjectAdapter mAdapter; 38 private int mContainerListAlignTop; 39 private OnItemSelectedListener mExternalOnItemSelectedListener; 40 private OnItemClickedListener mOnItemClickedListener; 41 private int mSelectedPosition = -1; 42 43 /** 44 * Sets the list of rows for the fragment. 45 */ 46 public void setAdapter(ObjectAdapter adapter) { 47 mAdapter = adapter; 48 if (mRowsFragment != null) { 49 mRowsFragment.setAdapter(adapter); 50 } 51 } 52 53 /** 54 * Returns the list of rows. 55 */ 56 public ObjectAdapter getAdapter() { 57 return mAdapter; 58 } 59 60 /** 61 * Sets an item selection listener. 62 */ 63 public void setOnItemSelectedListener(OnItemSelectedListener listener) { 64 mExternalOnItemSelectedListener = listener; 65 } 66 67 /** 68 * Sets an item Clicked listener. 69 */ 70 public void setOnItemClickedListener(OnItemClickedListener listener) { 71 mOnItemClickedListener = listener; 72 if (mRowsFragment != null) { 73 mRowsFragment.setOnItemClickedListener(listener); 74 } 75 } 76 77 /** 78 * Returns the item Clicked listener. 79 */ 80 public OnItemClickedListener getOnItemClickedListener() { 81 return mOnItemClickedListener; 82 } 83 84 @Override 85 public void onCreate(Bundle savedInstanceState) { 86 super.onCreate(savedInstanceState); 87 88 mContainerListAlignTop = 89 getResources().getDimensionPixelSize(R.dimen.lb_details_rows_align_top); 90 } 91 92 @Override 93 public View onCreateView(LayoutInflater inflater, ViewGroup container, 94 Bundle savedInstanceState) { 95 View view = inflater.inflate(R.layout.lb_details_fragment, container, false); 96 mRowsFragment = (RowsFragment) getChildFragmentManager().findFragmentById( 97 R.id.fragment_dock); 98 if (mRowsFragment == null) { 99 mRowsFragment = new RowsFragment(); 100 getChildFragmentManager().beginTransaction() 101 .replace(R.id.fragment_dock, mRowsFragment).commit(); 102 } 103 mRowsFragment.setAdapter(mAdapter); 104 mRowsFragment.setOnItemSelectedListener(mRowSelectedListener); 105 mRowsFragment.setOnItemClickedListener(mOnItemClickedListener); 106 return view; 107 } 108 109 private OnItemSelectedListener mRowSelectedListener = new OnItemSelectedListener() { 110 @Override 111 public void onItemSelected(Object item, Row row) { 112 if (mExternalOnItemSelectedListener != null) { 113 mExternalOnItemSelectedListener.onItemSelected(item, row); 114 } 115 } 116 }; 117 118 private void setVerticalGridViewLayout(VerticalGridView listview) { 119 // align the top edge of item to a fixed position 120 listview.setItemAlignmentOffset(0); 121 listview.setItemAlignmentOffsetPercent(VerticalGridView.ITEM_ALIGN_OFFSET_PERCENT_DISABLED); 122 listview.setWindowAlignmentOffset(mContainerListAlignTop); 123 listview.setWindowAlignmentOffsetPercent(VerticalGridView.WINDOW_ALIGN_OFFSET_PERCENT_DISABLED); 124 listview.setWindowAlignment(VerticalGridView.WINDOW_ALIGN_NO_EDGE); 125 } 126 127 /** 128 * Setup dimensions that are only meaningful when the child Fragments are inside 129 * DetailsFragment. 130 */ 131 private void setupChildFragmentLayout() { 132 VerticalGridView containerList = mRowsFragment.getVerticalGridView(); 133 setVerticalGridViewLayout(containerList); 134 } 135 136 @Override 137 public void onStart() { 138 super.onStart(); 139 setupChildFragmentLayout(); 140 mRowsFragment.getView().requestFocus(); 141 } 142} 143