片段适配器AlertDialog findFragmentByTag在手机上返回null

时间:2013-04-24 09:49:54

标签: android android-fragments android-adapter

我正在做一个典型的片段活动,左侧窗格,片段A,作为列表和右侧窗格,片段B作为内容(在平板电脑上),在手机上都在一个窗格中。

平板电脑版本的一切都很棒。但在手机版本上我遇到了一个问题。 My Fragment B由一些TextView组成,在它们下面是一个GridView。每次用户点击网格项时,我都想更新TextView。这很好用。问题是在网格适配器中实现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(),我的确如此。)

所以我假设问题与片段(或片段活动)“丢失焦点”片段有关。我只是不明白为什么它会在平板电脑上找到它(它可能会失去焦点,因为它有两个片段需要担心)而不是电话(其中FragmentB是当时唯一的活动片段)。

1 个答案:

答案 0 :(得分:0)

在onCustomerSelected()中,我忘记在“替换”行中添加TAG。

而不是

newTrans.replace(R.id.fragment_container, newCartFrag);

应该是

newTrans.replace(R.id.fragment_container, newCartFrag, FragmentB.TAG);

非常小的事情,所以我需要永远找到。