0

2 つのフラグメントで構成されるアクティビティ (HomeScreenActivity と呼ばれる) を実装しました。1 つはアイテムのリストを表示し、もう 1 つは選択したアイテムの詳細を表示します。詳細フラグメント (私のコードでは ResumeFragment) は一連のコンポーネントで構成されており、構成ファイルでセルの数として指定することで、ユーザーが高さと幅を構成できます。これらのコンポーネントは、ComponentsLayout と呼ばれるカスタム レイアウトに追加されます。

HomeScreenActivity を開くと、onCreate メソッドで各フラグメントが表示され、意図したとおりに表示されます。しかし、アイテム リスト フラグメント内のアイテムをクリックして、resumeFragment を同じクラスの新しいインスタンスに置き換えると、何も表示されません。

私はデバッグに多くの時間を費やしましたが、resumeFragment が指定された高さと幅を埋めていることがわかりますが、componentsLayout の高さは 1 しかありません。これは、コンポーネントの高さと幅が原因であることがわかりました。 componentsLayout onMeasure メソッドで layoutParams を設定しても、componentsLayout に含まれているものが設定されていません。

以下は、HomeScreenActivity、ResumeFragment、ComponentsLayout のコードです。

public class HomeScreenActivity extends FragmentActivity implements OnItemSelectedListener {
.
.

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.home_screen);

    .
    .

    //Check if device is in landscape orientation 
    if(width > height && isTablet) {
        //The patient context fragment must maintain the same width as when in portrait orientation.
        findViewById(R.id.patient_resume_fragment_container).setLayoutParams(new LinearLayout.LayoutParams(height, height));
        findViewById(R.id.screen_pager).setLayoutParams(new LinearLayout.LayoutParams(width-height, height));
        fragmentManager = getSupportFragmentManager();
        patientResumeFragment = new ResumeFragment();
        testFragment = new NysomTestFragment();
        fragmentTransaction = fragmentManager.beginTransaction();
        fragmentTransaction.replace(R.id.patient_resume_fragment_container, patientResumeFragment);
        fragmentTransaction.commit();
    }   
}

.
.

@Override
public void onItemSelected(Item item) {
    itemResumeFragment.getView().findViewById(R.id.componentsContainer);
    itemResumeFragment = new ResumeFragment(item);
    fragmentTransaction = fragmentManager.beginTransaction();
    fragmentTransaction.replace(R.id.item_resume_fragment_container, itemResumeFragment);
    fragmentTransaction.commit();
}

レジュメフラグメント

    @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    View fragmentView = inflater.inflate(R.layout.resume_fragment,container, false);
    ComponentsLayout componentsContainer = (ComponentsLayout) fragmentView.findViewById(R.id.componentsContainer);
    placeComponents(componentsContainer);
    return fragmentView;
}

private void placeComponents(ComponentsLayout layout) {
    List<ComponentConfig> configs = new ArrayList<ComponentConfig>(testMobile.getModel().getComponentConfiguration());

    int viewId = 1;

    for (ComponentConfig currConfig : configs) {
        ComponentsLayout.LayoutParams params = new ComponentsLayout.LayoutParams(0, 0);
        params.setWidthInCells(currConfig.getWidth());
        params.setHeightInCells(currConfig.getHeight());

        if (viewId == 1) {
            params.addRule(RelativeLayout.ALIGN_PARENT_TOP);
        } else {
            if (currConfig.getPositionX() > 0) {
                // looking for rightOf viewId
                params.addRule(RelativeLayout.RIGHT_OF, getRightOfComponentId(configs, currConfig, viewId - 1));
            }
            if (currConfig.getPositionY() > 0) {
                // looking for below viewId
                params.addRule(RelativeLayout.BELOW, getBelowComponentId(configs, currConfig, viewId - 1));
            }
        }

        try {
            // this code will be changed in story 9
            View view = currConfig.getClassType().newInstance().getView(getActivity());
            view.setId(viewId);
            view.setBackgroundColor(colors[(viewId - 1) % 6]);
            layout.addView(view, params);
        } catch (Exception e) {
            // we should never get to this point as configuration is validated
            Log.e(TAG, "getView: unable to create component for position " + viewId, e);
            throw new RuntimeException(e);
        }

        viewId++;
    }
}

そしてComponentLayout

public class ComponentsLayout extends RelativeLayout {

public ComponentsLayout(Context context, AttributeSet attrs) {
    super(context, attrs);
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);

    int parentWidth = MeasureSpec.getSize(widthMeasureSpec);
    int horizontalCellsNum = getResources().getInteger(R.integer.resume_horizontal_cells_num);
    int cellHeight = (int) (getResources().getDimension(R.dimen.resume_cell_height));

    int count = getChildCount();
    for (int i = 0; i < count; i++) {
        final View child = getChildAt(i);
        LayoutParams params = (LayoutParams) child.getLayoutParams();
        params.width = parentWidth * params.getWidthInCells() / horizontalCellsNum;
        params.height = cellHeight * params.getHeightInCells();
        child.setLayoutParams(params);
    }
}

繰り返しますが、これは HomeScreenActivity onCreate メソッドから呼び出された場合には機能しますが、onItemSelected メソッドから呼び出された場合には機能しません。

誰か助けてくれませんか??

4

1 に答える 1

0

componentLayout で onMeasure が呼び出される前に、すべてのレイアウト パラメータをコンポーネントに追加することで回避策を作成しました。それは私が探していた解決策ではありませんでしたが、非常に単純だったので、見落としていたのかもしれません。

于 2012-03-09T07:15:20.333 に答える