3

Activity2 つのフラグメントをホストする を実装しました。左に 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 をロードしますが、画面全体をカバーし、ペインの右側に限定されません。

4

1 に答える 1

0

OK、問題は解決しました。私のonActivityCreated()方法では、次のように呼び出しました。

listView.setAdapter(adapter);

戻って、機能しているフラグメントと機能していないフラグメントを比較しました。私は代わりにこれを呼んだものの中で見つけました:

setListAdapter(adapter);

非動作フラグメントを callsetListAdatpter(adapter)ではなくに変更しましたlistView.setAdapter(adapter)。そして今、フラグメントは本来あるべきように画面の右側に表示されています。これを手伝ってくれて調べてくれたみんなに感謝します。

于 2013-01-08T04:10:23.673 に答える