DetailsFragment.java revision 1caf420879768ae8aebe8c27546707a28f3bb659
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.OnChildSelectedListener; 19import android.support.v17.leanback.widget.OnItemClickedListener; 20import android.support.v17.leanback.widget.OnItemSelectedListener; 21import android.support.v17.leanback.widget.Row; 22import android.support.v17.leanback.widget.VerticalGridView; 23import android.util.Log; 24import android.app.Fragment; 25import android.os.Bundle; 26import android.view.LayoutInflater; 27import android.view.View; 28import android.view.ViewGroup; 29 30/** 31 * Wrapper fragment for leanback details screens. 32 */ 33public class DetailsFragment extends Fragment { 34 private static final String TAG = "DetailsFragment"; 35 private static boolean DEBUG = false; 36 37 private RowsFragment mRowsFragment; 38 39 private ObjectAdapter mAdapter; 40 private int mContainerListAlignTop; 41 private OnItemSelectedListener mExternalOnItemSelectedListener; 42 private OnItemClickedListener mOnItemClickedListener; 43 private int mSelectedPosition = -1; 44 45 /** 46 * Sets the list of rows for the fragment. 47 */ 48 public void setAdapter(ObjectAdapter adapter) { 49 mAdapter = adapter; 50 if (mRowsFragment != null) { 51 mRowsFragment.setAdapter(adapter); 52 } 53 } 54 55 /** 56 * Returns the list of rows. 57 */ 58 public ObjectAdapter getAdapter() { 59 return mAdapter; 60 } 61 62 /** 63 * Sets an item selection listener. 64 */ 65 public void setOnItemSelectedListener(OnItemSelectedListener listener) { 66 mExternalOnItemSelectedListener = listener; 67 } 68 69 /** 70 * Sets an item Clicked listener. 71 */ 72 public void setOnItemClickedListener(OnItemClickedListener listener) { 73 mOnItemClickedListener = listener; 74 if (mRowsFragment != null) { 75 mRowsFragment.setOnItemClickedListener(listener); 76 } 77 } 78 79 /** 80 * Returns the item Clicked listener. 81 */ 82 public OnItemClickedListener getOnItemClickedListener() { 83 return mOnItemClickedListener; 84 } 85 86 @Override 87 public void onCreate(Bundle savedInstanceState) { 88 super.onCreate(savedInstanceState); 89 90 mContainerListAlignTop = 91 getResources().getDimensionPixelSize(R.dimen.lb_details_rows_align_top); 92 } 93 94 @Override 95 public View onCreateView(LayoutInflater inflater, ViewGroup container, 96 Bundle savedInstanceState) { 97 View view = inflater.inflate(R.layout.lb_details_fragment, container, false); 98 mRowsFragment = (RowsFragment) getChildFragmentManager().findFragmentById( 99 R.id.fragment_dock); 100 if (mRowsFragment == null) { 101 mRowsFragment = new RowsFragment(); 102 getChildFragmentManager().beginTransaction() 103 .replace(R.id.fragment_dock, mRowsFragment).commit(); 104 } 105 mRowsFragment.setOnItemSelectedListener(mRowSelectedListener); 106 mRowsFragment.setOnItemClickedListener(mOnItemClickedListener); 107 mRowsFragment.setAdapter(mAdapter); 108 return view; 109 } 110 111 private OnItemSelectedListener mRowSelectedListener = new OnItemSelectedListener() { 112 @Override 113 public void onItemSelected(Object item, Row row) { 114 if (mExternalOnItemSelectedListener != null) { 115 mExternalOnItemSelectedListener.onItemSelected(item, row); 116 } 117 } 118 }; 119 120 private void setVerticalGridViewLayout(VerticalGridView listview) { 121 // align the top edge of item to a fixed position 122 listview.setItemAlignmentOffset(0); 123 listview.setItemAlignmentOffsetPercent(VerticalGridView.ITEM_ALIGN_OFFSET_PERCENT_DISABLED); 124 listview.setWindowAlignmentOffset(mContainerListAlignTop); 125 listview.setWindowAlignmentOffsetPercent(VerticalGridView.WINDOW_ALIGN_OFFSET_PERCENT_DISABLED); 126 listview.setWindowAlignment(VerticalGridView.WINDOW_ALIGN_NO_EDGE); 127 } 128 129 /** 130 * Setup dimensions that are only meaningful when the child Fragments are inside 131 * DetailsFragment. 132 */ 133 private void setupChildFragmentLayout() { 134 VerticalGridView containerList = mRowsFragment.getVerticalGridView(); 135 setVerticalGridViewLayout(containerList); 136 } 137 138 @Override 139 public void onStart() { 140 super.onStart(); 141 setupChildFragmentLayout(); 142 mRowsFragment.getView().requestFocus(); 143 } 144} 145