0

左ペインのフラグメント A をリストとして、右ペインのフラグメント B をコンテンツとして (タブレット上で)、携帯電話では両方が 1 つのペインにある典型的なフラグメント アクティビティを実行しています。

タブレット版ではすべてがうまく機能します。しかし、電話版では問題が発生します。私のフラグメント B は、いくつかの TextView とその下の GridView で構成されています。ユーザーがグリッド項目をクリックするたびに TextViews を更新したいと思います。これはうまくいきます。問題は、グリッド アダプタ内に AlertDialog を実装することにあります。

OnClickListener clickListener = new OnClickListener() {
    @Override
    public void onClick(View v) {
        AlertDialog.Builder builder = new AlertDialog.Builder(mContext.getContext());               
        ...             
        builder.setPositiveButton(mContext.getContext().getResources().getString(
            R.string.ok),  new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {

                    fragActivity.getSupportFragmentManager().executePendingTransactions();

                    FragmentB f = (FragmentB)
                        ((MyActivity) fragActivity).getSupportFragmentManager()
                        .findFragmentByTag(FragmentB.TAG);

                    item.setAmount(helperDouble);  //shouldn't be relevant to the problem
                    if (f != null) {
                        Log.i("GridAdapter", "f is not null, updating views");
                        f.updateViews();                                    
                    } else {
                        Log.i("GridAdapter", "f is null, what the...");
                    }
                }
            }
        });

        AlertDialog dialog = builder.create();
        dialog.show();
    }
};

FragmentB f はタブレットでは毎回正常に返されますが、私が何をしているように見えても、電話では常に null が返されます。this SO postに似ているようですが、それを自分の状況に適用できるかどうかはわかりません。MyActivity にフラグメントを追加する方法は次のとおりです。

@Override
public void onCustomerSelected(Customer customer, int index) {
    //update fragment here

    if (isScreenSizeLarge()) {  //if tablet:
        FragmentB f;
        //if fragment doesn't exist, create it
        if (getSupportFragmentManager().findFragmentByTag(FragmentB.TAG) == null) {
            f = FragmentB.newInstance(customer, index);
            FragmentTransaction trans = getSupportFragmentManager().beginTransaction();
            trans.add(R.id.fragment_b_container, f, FragmentB.TAG);
            trans.commit();
            getSupportFragmentManager().executePendingTransactions();
        } else {
            f = (FragmentB) getSupportFragmentManager()
                .findFragmentByTag(FragmentB.TAG);
        }
    } else {       //if phone:
        FragmentB newCartFrag = FragmentB.newInstance(customer, index);
        FragmentTransaction newTrans = getSupportFragmentManager().beginTransaction();
        newTrans.replace(R.id.fragment_container, newCartFrag);
        newTrans.addToBackStack(FragmentB.TAG);
        newTrans.commit();
        getSupportFragmentManager().executePendingTransactions();
    }
}

(はい、executePendingTransactions() を 2 回呼び出したことは承知しています。念のため実行しました。)

したがって、問題はフラグメント(またはフラグメントアクティビティ)がフラグメントの「フォーカスを失っている」ことに関係していると思います。タブレットでそれが見つかる理由 (心配するフラグメントが 2 つあるためフォーカスを失う可能性があります) と、電話では見つからない理由 (その時点で FragmentB が唯一のアクティブなフラグメントである) の違いがわかりません。

4

1 に答える 1