2011-08-03 117 views
25

我添加使用获取片段的容器视图id

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

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

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

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

回答

65

你可以通过调用

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

它给我null任何想法,当我尝试说LinearLayout x =(LinearLayout)((ViewGroup)getView()时,我有主屏幕包含布局,我用作父级的布局。getParent());在片段类中被调用,但它总是为空 – AMH

+0

工作就像一个魅力,谢谢你为我节省了时间 –

11

不知道,如果我完全理解你的问题,但你在onCreateView中获得容器。我想你可以把它藏在一个局部变量中。

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

你明白正确。我可以这样做,但对我来说它更像是一种黑客。容器在这里被传递给片段以便能够膨胀它的视图,我怀疑它应该被存储以供将来使用。以某种更原始的方式获取容器视图ID存在? –

+1

我看不出这种方法有什么问题。如果您不想存储视图,只需存储该ID。 –

5

假设你访问容器的id有片段例如mCurrentFragment在Activity类。 您可以通过

int id = mCurrentFragment.getView().getParent().getId(); 
ViewGroup vg = (ViewGroup) findViewById(id); // Fragment's container View 
+1

(如果我正确理解你在做什么)你从**获得id的对象是**你正在寻找的对象对于。这两行可以用下面的代码替换:'ViewGroup vg =(ViewGroup)mCurrentFragment.getView()。getParent();'这不会等同于你所做的任何情况? – ToolmakerSteve

+0

是@ToolmakerSteve,它们总是等价的。感谢您为我发现。 –

8

得到碎片的容器查看我觉得有访问视图,而不是使用

((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。

+1

好吧,在这个问题后的几个星期里,我已经了解到Fragments的设计缺陷超出了可用性,并且再也没有使用过Fragments。 –