Lab*_*lan 168 android android-fragments
在我的main.xml
我
<FrameLayout
android:id="@+id/frameTitle"
android:padding="5dp"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:background="@drawable/title_bg">
<fragment
android:name="com.fragment.TitleFragment"
android:id="@+id/fragmentTag"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
</FrameLayout>
Run Code Online (Sandbox Code Playgroud)
我正在设置像这样的片段对象
FragmentManager fragmentManager = activity.getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
Fragment newFragment = new FragmentType1();
fragmentTransaction.replace(R.id.frameTitle, casinodetailFragment, "fragmentTag");
// fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
Run Code Online (Sandbox Code Playgroud)
它FragmentType2,FragmentType3,...
在不同的时间设置不同类型的Fragment对象().现在在某个时间点我需要确定当前存在哪个对象.
在短,我需要做这样的事情:
Fragment currentFragment = //what is the way to get current fragment object in FrameLayout R.id.frameTitle
Run Code Online (Sandbox Code Playgroud)
我尝试了以下内容
TitleFragment titleFragmentById = (TitleFragment) fragmentManager.findFragmentById(R.id.frameTitle);
Run Code Online (Sandbox Code Playgroud)
和
TitleFragment titleFragmentByTag = (TitleFragment) fragmentManager.findFragmentByTag("fragmentTag");
Run Code Online (Sandbox Code Playgroud)
但是两个对象(titleFragmentById和titleFragmentByTag)都是null
我错过了什么吗?
我正在使用Compatibility Package, r3
和开发API level 7
.
findFragmentById()
并且findFragmentByTag()
如果我们使用fragmentTransaction.replace
或设置片段将会工作fragmentTransaction.add
,但是return null
如果我们将对象设置为xml(就像我在我的工作中那样main.xml
).我想我的XML文件中缺少一些东西.
Com*_*are 248
现在在某个时间点我需要确定当前存在哪个对象
呼叫findFragmentById()
上FragmentManager
并确定哪些片段是在你的R.id.frameTitle
容器.
Ham*_*mer 106
试试这个,
Fragment currentFragment = getActivity().getFragmentManager().findFragmentById(R.id.fragment_container);
Run Code Online (Sandbox Code Playgroud)
这将给你当前片段,然后你可以将它与片段类进行比较并做你的事情.
if (currentFragment instanceof NameOfYourFragmentClass) {
Log.v(TAG, "find the current fragment");
}
Run Code Online (Sandbox Code Playgroud)
小智 37
我认为你可以使用onAttachFragment事件可能有助于捕获哪个片段是活动的.
@Override
public void onAttachFragment(Fragment fragment) {
// TODO Auto-generated method stub
super.onAttachFragment(fragment);
Toast.makeText(getApplicationContext(), String.valueOf(fragment.getId()), Toast.LENGTH_SHORT).show();
}
Run Code Online (Sandbox Code Playgroud)
Niq*_*iqo 12
我认为你应该这样做:
Fragment currentFragment = fragmentManager.findFragmentByTag("fragmentTag");
Run Code Online (Sandbox Code Playgroud)
原因是因为您将标签"fragmentTag"设置为您添加的最后一个片段(当您调用replace时).
elu*_*eci 10
您可以获取片段列表并查看最后一个片段.
FragmentManager fm = getSupportFragmentManager();
List<Fragment> fragments = fm.getFragments();
Fragment lastFragment = fragments.get(fragments.size() - 1);
Run Code Online (Sandbox Code Playgroud)
但有时(当您向后导航时)列表大小保持不变,但最后一些元素为空.所以在列表中我迭代到最后一个非null片段并使用它.
FragmentManager fm = getSupportFragmentManager();
if (fm != null) {
List<Fragment> fragments = fm.getFragments();
if (fragments != null) {
for(int i = fragments.size() - 1; i >= 0; i--){
Fragment fragment = fragments.get(i);
if(fragment != null) {
// found the current fragment
// if you want to check for specific fragment class
if(fragment instanceof YourFragmentClass) {
// do something
}
break;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
小智 10
这是最简单的解决方案,对我有用.
1.)你添加你的片段
ft.replace(R.id.container_layout, fragment_name, "fragment_tag").commit();
Run Code Online (Sandbox Code Playgroud)
2.)
FragmentManager fragmentManager = getSupportFragmentManager();
Fragment currentFragment = fragmentManager.findFragmentById(R.id.container_layout);
if(currentFragment.getTag().equals("fragment_tag"))
{
//Do something
}
else
{
//Do something
}
Run Code Online (Sandbox Code Playgroud)
可能会迟到但我希望它可以帮助其他人,同时@CommonsWare也发布了正确答案.
FragmentManager fm = getSupportFragmentManager();
Fragment fragment_byID = fm.findFragmentById(R.id.fragment_id);
//OR
Fragment fragment_byTag = fm.findFragmentByTag("fragment_tag");
Run Code Online (Sandbox Code Playgroud)
也许最简单的方法是:
public MyFragment getVisibleFragment(){
FragmentManager fragmentManager = MainActivity.this.getSupportFragmentManager();
List<Fragment> fragments = fragmentManager.getFragments();
for(Fragment fragment : fragments){
if(fragment != null && fragment.getUserVisibleHint())
return (MyFragment)fragment;
}
return null;
}
Run Code Online (Sandbox Code Playgroud)
它对我有用
您可以在父活动类中创建字段:
public class MainActivity extends AppCompatActivity {
public Fragment fr;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
}
Run Code Online (Sandbox Code Playgroud)
然后在每个片段类中:
public class SomeFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater,
ViewGroup container, Bundle savedInstanceState) {
((MainActivity) getActivity()).fr = this;
}
Run Code Online (Sandbox Code Playgroud)
您的“ fr”字段是当前片段对象
它也与popBackStack()一起工作
归档时间: |
|
查看次数: |
288112 次 |
最近记录: |