【问题标题】:Show fragment from Array Adapter显示来自阵列适配器的片段
【发布时间】:2017-01-22 23:33:47
【问题描述】:

我有一个应用程序,它使用几个片段来显示不同的选项卡。 第一个片段是带有自定义单元格的列表视图。每个单元格都有自己的一组按钮。我想在单击按钮时显示不同的片段。要知道何时单击了所需的按钮,我在列表的数组适配器中添加了一个 onclick 事件。有没有办法显示来自 Array Adapter 的新片段。到目前为止我尝试过的并没有奏效:

    final FragmentManager fragmentManager = ((Activity)mContext)getSupportFragmentManager();
    final FragmentTransaction fragmentTransaction =                  fragmentManager.beginTransaction();

    PostFragment postFr = new PostFragment();

    fragmentTransaction.replace(R.id.detail_container, postFr);


    fragmentTransaction.commit();

【问题讨论】:

  • 您在getSupportFragmentManager 之前缺少一个句点,并且基础 Activity 类没有该方法

标签: android android-fragments


【解决方案1】:

试试这个代码:

final FragmentManager fragmentManager = ((FragmentActivity)mContext).getSupportFragmentManager();
final FragmentTransaction fragmentTransaction =  fragmentManager.beginTransaction();
PostFragment postFr = new PostFragment();
fragmentTransaction.replace(R.id.detail_container, postFr);
fragmentTransaction.commit();

getSupportFragmentManager() 只为 FragmentActivity 类定义,不适用于 Activity

【讨论】:

  • 我现在看到了。如果你能在你的回答中解释这一点会很有用
  • 如果他将 getApplicationContext() 传递给他的适配器的构造函数(他从中调用此代码)而不是传递 getActivity(),这可能会引发 ClassCastException
  • @Petar Ivanov 你试过了吗?
  • 不,我没有。尝试了其他解决方案。稍后会尝试这个。
【解决方案2】:

当您尝试这样做时具体出了什么问题?

这是我用来转到新片段的方法。我把它放在一个抽象的 BaseActivity 类(扩展 AppCompatActivity)中,这样我的所有实现活动都可以使用该方法。

该方法采用您要转到的片段,以及一个布尔变量来指示是否将事务添加到后台堆栈。

活动必须在其 XML 资源文件中声明一个 FrameLayout,其 id 为“容器”。这是放置碎片的地方。

public void gotoFragment(Fragment fragment, boolean addToBackStack) {
    FragmentTransaction transaction = getSupportFragmentManager()
            .beginTransaction()
            .replace(R.id.container, fragment);
    if (addToBackStack) {
        transaction.addToBackStack(null);
    }
    transaction.commit();
}

为了从您的 ArrayAdapter 类调用此方法,请将 BaseActivity 的一个实例传递给您的 Adapter 的构造函数。

对于适配器的Context参数,从fragment传递getActivity()。

如果您的所有活动类都扩展了 BaseActivity 类,您可以放心地在适配器中说:

public class CustomArrayAdapter extends ArrayAdapter {

private BaseActivity mActivity;

public CustomArrayAdapter(Context pContext, int pLayoutResource, List<Object> pItems) {
    super(pContext, pLayoutResource);
    mActivity = (BaseActivity) pContext;
}

@Override
public void onItemClick(int position) {
    if (mActivity != null) {
        mActivity.goToFragment(new PostFragment());
    }
}

【讨论】:

  • 嘿伙计,我按照你的建议做了,活动中的方法被调用但什么也没发生:{ FragmentTransaction transaction = getSupportFragmentManager() .beginTransaction() .replace(R.id.timeline_fragment_layout, fragment) ;事务.commit(); } timeline_fragment_layout 是带有列表视图的片段的主要布局。我m doing smth wrong but cant 找到什么。 Android 开发对我来说是新事物
  • 在你的timeline_fragment_layout 资源文件中,你需要声明一个ID 为'container' 的FrameLayout :) 这是放置片段的地方。目前没有用于放置片段的容器。
  • 嗯,我m not completely sure what Im 做错了,但这里是框架布局: Im opening it : FragmentTransaction transaction = getSupportFragmentManager() .beginTransaction() .replace(R.id.detail_container, fragment); transaction.commit(); This is called, but the fragment is not showed. Im 确实是很少,但它让我抓狂
  • 我将尝试解释结构: - 我有一个主要活动是持有 Tab Pager。 - 5 个标签有 5 个不同的片段; - 在第一个选项卡上,我有带有列表视图的片段。此列表视图的单元格有三个按钮,当单击其中一个按钮时,我需要显示详细的片段,并将标签栏保持在底部
  • 在 ViewPager 中浏览片段与在 ViewPager 之外浏览片段非常不同!当你说你有一个主要活动是持有 TabPager - 你是什么意思?你能发布更多代码吗?
猜你喜欢
  • 1970-01-01
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-10
相关资源
最近更新 更多