gpt4 book ai didi

Android - getActivity() 从 dialogFragment 返回 null

转载 作者:行者123 更新时间:2023-11-30 02:47:58 25 4
gpt4 key购买 nike

我对 fragment 相当陌生,所以如果这是非常基础的,我深表歉意。

我的应用程序包含一个 ViewPager,可以使用 ListView 在多个不同的选项卡之间滑动。单击一个特定的 ListView 项目时,我想打开一个显示一些选项的 DialogFragment。我的 Intent 是让 DialogFragment 处理单击事件并将选定的对话框项反馈给调用它的 fragment 。为此,我向 MainActivity(其中包含 ViewPager)提供回调并将该信息提供给正确的 ViewPager fragment 。

我注意到我的 DialogFragment 在 getActivity() 上返回 null,我认为这是因为我的 DialogFragment 没有正确附加到我的 MainActivity。我怎样才能做到这一点?考虑到我是回调的新手,而且处理 fragment 的大多数其他示例都是针对标准 fragment 的,而不是来自 ViewPager 的 fragment ,我发现解决这个问题有点困难。

我的对话如何识别正确的 Activity ?我应该将 fragment 附加到 FragmentManager 吗?如果是这样,它是否应该附加到与 ViewPager fragment 相同的 FragmentManager?

这是我的代码,但我不确定它会有多大帮助。

CalibrationFragment.java - 调用 DialogFragment。 (不确定这是否是正确的方法。)

ModeDialogFragment modeDialog = ModeDialogFragment.newInstance(R.string.mode_calibration);
modeDialog.onCreateDialog(null);

ModeDialogFragment.java - 我的 DialogFragment

public class ModeDialogFragment extends DialogFragment{

public static ModeDialogFragment newInstance(int title) {
ModeDialogFragment frag = new ModeDialogFragment();
Bundle args = new Bundle();
args.putInt("title", title);
frag.setArguments(args);

return frag;
}

public void onAttach(Activity activity){
super.onAttach(activity);
}

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
int title = getArguments().getInt("title");
final Context mContext = getActivity();
getActivity().getFragmentManager().beginTransaction().add(newInstance(R.string.mode_calibration), "my_fragment").commit();
// Trying to add my dialog to the MainActivity, not working.

final CharSequence[] modeItems = {
"Option 1", "Option 2", "Option 3"
};
final int checkedItem = 2; // Make final for now, resolve this later

AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setTitle(getResources().getString(R.string.mode_calibration));
builder.setSingleChoiceItems(modeItems, checkedItem, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int item) {
// Handle the selection here

((MainActivity)getActivity()).updateModeData();
}
});
return(builder.create());
}
}

主 Activity .java

    public class MainActivity extends FragmentActivity implements ActionBar.TabListener {
// Initialise variables
private Context mContext;
// [Others...]

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

// Initialisation
viewPager = (ViewPager) findViewById(R.id.pager);
actionBar = getActionBar();
mAdapter = new TabsPagerAdapter(getSupportFragmentManager());
}

public Fragment findFragmentByPosition(int position) {
int viewId = R.id.pager;
//FragmentPagerAdapter fragmentPagerAdapter = getFragmentPagerAdapter();
return getSupportFragmentManager().findFragmentByTag(
makeFragmentName(viewId, position));
}

// Needed to identify a fragment from ViewPager
private static String makeFragmentName(int viewId, int position)
{
return "android:switcher:" + viewId + ":" + position;
}

public void updateModeData(){
// Make call to the fragment to deal with the data
CalibrationFragment calFragment = (CalibrationFragment) findFragmentByPosition(3);
((CalibrationFragment) calFragment).doUpdateModeData();
}
}

如有任何帮助或指导,我们将不胜感激!

编辑: 问题确实是我没有将 fragment 添加到 FragmentManager 并正确调用它。这是我使用的代码。 我的代码仍然没有完整运行,但是为了这个问题的目的,我的 DialogFragment 现在可以访问 MainActivity。

CalibrationFragment.java - 调用 DialogFragment

FragmentManager fm = getFragmentManager();
FragmentTransaction ft = fm.beginTransaction();

ModeDialogFragment modeDialog = ModeDialogFragment.newInstance(R.string.mode_calibration);
String title = makeFragmentName(R.id.pager, 3); // makeFragmentName as specified in MainActivity.java
modeDialog.show(ft, title);

ModeDialogFragment.java 与之前相同,但删除了以下行:

getActivity().getFragmentManager().beginTransaction().add(newInstance(R.string.mode_calibration), title).commit();

最佳答案

您不应该自己调用onCreateDialog。只需使用 FragmentTransaction 调用 show 方法:

FragmentTransaction ft = getFragmentManager().beginTransaction();
ModeDialogFragment modeDialog = ModeDialogFragment.newInstance(R.string.mode_calibration);
modeDialog.show(ft, null);

此处描述了 DialogFragment 的正确用法:http://developer.android.com/reference/android/app/DialogFragment.html

关于Android - getActivity() 从 dialogFragment 返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24711986/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com