【问题标题】:Get fragment's container view id获取片段的容器视图 id
【发布时间】:2011-08-03 11:47:46
【问题描述】:

我添加了一个片段

transaction.add(R.id.content, fragment, null);

我需要从这个开始新的片段。但要做到这一点,我需要知道第一个片段的容器视图 ID(在我的例子中是 R.id.content)。我怎样才能得到这个?

我可以直接使用这个 id,但我想片段不应该知道关于父活动的这种细节。例如,在这种情况下,将无法在另一个活动中使用此片段。

可能从另一个片段“开始”片段是一种不好的做法,所有片段处理逻辑都应该由活动本身处理?但是创建彼此开始的漂亮片段序列似乎非常有用(例如 detalView->moreDetailView->evenMoreDetailView)。

【问题讨论】:

    标签: android android-fragments containers android-view


    【解决方案1】:

    你可以通过调用来访问容器的id

    ((ViewGroup)getView().getParent()).getId();
    

    【讨论】:

    • 它给了我任何想法,我有一个包含布局的主屏幕,当我尝试说 LinearLayout x =(LinearLayout) ((ViewGroup)getView().getParent( ));在 Fragment 类中被调用,但它始终为空
    【解决方案2】:

    我不知道我是否完全理解您的问题,但您在 onCreateView 中获得了 Container。我想你可以将它存储在一个局部变量中。

    public View onCreateView(LayoutInflater inflater, 
      ViewGroup container,
      Bundle savedInstanceState) {
      mContainer = container;
      ...
    }
    

    【讨论】:

    • 你理解的没错。我可以这样做,但对我来说似乎更像是一种黑客行为。这里的容器被传递给片段以便能够扩大它的视图,我怀疑它应该被存储以备将来使用。是否存在某种更原生的获取容器视图 ID 的方式?
    • 我看不出这种方法有什么问题。如果您不想存储视图,只需存储 id。
    【解决方案3】:

    我认为有一种更标准的方式来访问视图而不是使用

    ((ViewGroup) getView().getParent()).getId()
    

    我假设您正在使用一个 MainActivity,它呈现一个列表片段,然后它可以在单击一个项目时呈现另一个列表片段,依此类推。我假设您已选择将 MainActivity 的主视图替换为您呈现的列表片段的内容。

    由于每个列表片段都托管在 MainActivity 中,因此您始终可以访问 MainActivity 的视图。

    // Inside of onListItemClick...
    FragmentManager fm = getFragmentManager();
    Fragment fragment = new MyOtherListFragment();
    
    FrameLayout contentView = (FrameLayout) getActivity().findViewById(R.id.content_view);
    
    fm.beginTransaction()
            .replace(contentView.getId(), fragment)
            .addToBackStack(null)
            .commit();
    

    上面的例子假设你有一个在MainActivity中设置的XML布局资源,调用XML资源R.layout.activity_main,其中有一个id为R.id.content_view的FrameLayout。这是我采取的方法。我在这里展示的示例是我在应用程序中实际编写的示例的一个更简单的版本。

    顺便说一句,我的 IntelliJ 版本(1.0.1 版)警告我

    ((ViewGroup) getView().getParent)
    

    可能会抛出 NullPointerException。

    【讨论】:

    • 好吧,在提出这个问题几周后,我了解到 Fragments 设计存在超出可用性点的缺陷,并且再也没有使用过 Fragments。
    【解决方案4】:

    假设您在 Activity 类中有 Fragment 实例mCurrentFragment。 您可以通过

    获取Fragment的容器视图
    int id = mCurrentFragment.getView().getParent().getId();
    ViewGroup vg = (ViewGroup) findViewById(id); // Fragment's container View
    

    【讨论】:

    • (如果我理解正确你在做什么)你从 获得 id 的对象是 你正在寻找的对象。这两行可以替换为更短的:ViewGroup vg = (ViewGroup) mCurrentFragment.getView().getParent(); 任何情况下这不等同于您所做的?
    • 是的@ToolmakerSteve,它们总是等价的。感谢您为我发现这一点。
    猜你喜欢
    • 1970-01-01
    • 2015-12-25
    • 1970-01-01
    • 2012-09-19
    • 1970-01-01
    • 2014-05-13
    • 2013-09-20
    • 2012-07-31
    相关资源
    最近更新 更多