Activity
2 つのフラグメントをホストする を実装しました。左に 1 つ、右に 1 つのフラグメントがあります。左側のフラグメントは、クリックするアイテムのリストです。クリックすると、右側の新しいフラグメントが膨らみます。
左のリストの 1 つの項目は、右の別のリストを膨らませることになっています。その項目をクリックすると、リストが膨張して画面全体をカバーすることを除いて、うまく機能しています。そして、画面の右側のスペースだけをカバーしたい.
フラグメントが画面全体を覆わないようにする方法はありますか? 他のすべては画面の右側にとどまりますが、そうでないのはこの 1 つだけです。ListView
しかし、右側を膨らませようとしているのはこれだけです。
ListFragemnt
右側に膨らんだ右側にあると思われるの関連メソッドは次のとおりです。
public void onActivityCreated(Bundle inState) {
super.onActivityCreated(inState);
//setContentView(R.layout.results_list_activity);
//mIntent = getIntent();
mActivity = getActivity();
mArrayListRecipe = generateList();
ListView listView = (ListView) mActivity.findViewById(android.R.id.list);
ArrayAdapter<Recipe> adapter = new ArrayAdapter<Recipe>(mActivity,
android.R.layout.simple_list_item_1, mArrayListRecipe);
listView.setAdapter(adapter);
//listView.setOnItemClickListener((OnItemClickListener) this);
}
public View onCreateView (LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
LinearLayout layout = (LinearLayout) inflater.inflate(R.layout.results_list_activity, container, false);
return layout;
}
そして、これが results_list_activity.xml と呼ばれるインフレートされた XML レイアウトです。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal" >
<ListView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@android:id/list"
android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1"/>
そして、これをmain_activity.xmlListView
に配置するフレームを含むレイアウトを次に示します。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:id="@+id/main_layout_land"
android:layout_width="match_parent" android:layout_height="wrap_content"
android:orientation="horizontal" android:layout_alignParentBottom="true">
<!-- Left side fragment -->
<fragment class="com.jasoncrosby.app.recipeorganizer.MainFragment" android:id="@+id/left_fragment"
android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1"/>
<!-- Right side fragment -->
<FrameLayout android:id="@+id/right_fragment" android:layout_width="0dp" android:layout_height="match_parent"
android:layout_weight="1"/>
</LinearLayout>
編集:
フラグメントをロードするアクティビティは単純で、次の呼び出しのみで構成されます。
setContentView(R.layout.main_activity);
MainFragment.javaは次のとおりです。
public class MainFragment extends ListFragment {
//*******
// Fields
//*******
/** Indicated weather there is enough room on the screen to use 2 panes. */
private boolean mDualPane;
/** Indicates which item in the main list was clicked. */
private int mCurCheckPosition = 0;
/** The name of the save button. */
private String mStringSaveItemName;
/** The name of the search button. */
private String mStringSearchItemName;
/** The name of the browse button. */
private String mStringBrowseItemName;
/** The name of the random button. */
private String mStringRandomItemName;
/** The {@code Activity} associated with this {@code Fragment}. */
private Activity mActivity;
//*************
// Constructors
//*************
/**
* This constructor is only provided to avoid a compiler warning. It should not be used to crate a new
* {@code MainFragment} object.
*/
public MainFragment(){}
/**
* Used to create a new {@code MainFragment} object with the id.
*
* @param id
*/
//public MainFragment(int id) {
//mIntFragmentId = id;
//mContext = context;
//}
//*******************
// Overridden methods
//*******************
@Override
public void onActivityCreated(Bundle savedState) {
super.onActivityCreated(savedState);
mActivity = getActivity();
mStringSaveItemName = mActivity.getString(R.string.save_button);
mStringSearchItemName = mActivity.getString(R.string.search_button);
mStringBrowseItemName = mActivity.getString(R.string.browse_button);
mStringRandomItemName = mActivity.getString(R.string.random_button);
// Populate list with our static array of titles.
setListAdapter(new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1,
new String[] {mStringSaveItemName, mStringSearchItemName, mStringBrowseItemName,
mStringRandomItemName}));
// Check to see if we have a frame in which to embed the details
// fragment directly in the containing UI.
View detailsFrame = mActivity.findViewById(R.id.right_fragment);
mDualPane = detailsFrame != null && detailsFrame.getVisibility() == View.VISIBLE;
if (mDualPane) {
// In dual-pane mode, list view highlights selected item.
getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE);
// Make sure our UI is in the correct state.
showDetails(mCurCheckPosition);
}
}
@Override
public void onListItemClick(ListView l, View v, int pos, long id) {
showDetails(pos);
}
//****************
// Private methods
//****************
private void showDetails(int index) {
mCurCheckPosition = index;
if (mDualPane) {
switch (mCurCheckPosition) {
case 0 : inflateFirstUi(); break;
case 1 : inflateSecondUi(); break;
case 2 : inflateThirdUi(); break;
case 3 : inflateFourthUi(); break;
default : inflateFirstUi(); break;
}
} 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);
}
}
private void inflateFirstUi() {
SaveFragment details = new SaveFragment();
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.replace(R.id.right_fragment, details);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
ft.commit();
}
private void inflateSecondUi() {
SearchFragment details = new SearchFragment();
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.replace(R.id.right_fragment, details);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
ft.commit();
}
private void inflateThirdUi() {
ResultsListFragment details = new ResultsListFragment(Constants.BROWSE_REQUEST);
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.replace(R.id.right_fragment, details);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
ft.commit();
}
private void inflateFourthUi() {
ResultsListFragment details = new ResultsListFragment(Constants.RANDOM_REQUEST);
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.replace(R.id.right_fragment, details);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
ft.commit();
}
}
問題はshowDetails()
、switch ステートメントのメソッドにあります。ケース 0 とケース 1 は問題なく動作し、画面の右側にあるペインにロードされます。ケース 3 は、この問題に遭遇した場所です。UI をロードしますが、画面全体をカバーし、ペインの右側に限定されません。