如何通过代码设置片段标签?
Posted
技术标签:
【中文标题】如何通过代码设置片段标签?【英文标题】:How to set a Fragment tag by code? 【发布时间】:2011-09-16 11:31:15 【问题描述】:我在Fragment
类中没有找到类似setTag(String tagName)
的方法。我发现设置Fragment
标签的唯一方法是执行FragmentTransaction
并将标签名称作为参数传递。
这是通过代码显式设置Fragment
标签的唯一方法吗?
【问题讨论】:
【参考方案1】:是的。所以唯一的方法是在交易时,例如使用add
、replace
,或作为布局的一部分。
我通过检查兼容性来源确定了这一点,因为我在过去的某个时间短暂地寻找过类似的东西。
【讨论】:
您的答案在于 [here][1] 在 *** [1] 上的帖子中:***.com/questions/9363072/android-set-fragment-id 使用 FragmentTransaction 的 add(int containerViewId, Fragment fragment, String tag) 如下所述:***.com/a/13244471/4002895@PJL 请编辑你的答案。这个答案误导了人们 那很不方便。【参考方案2】:你可以这样设置tag到fragment:
Fragment fragmentA = new FragmentA();
getFragmentManager().beginTransaction()
.replace(R.id.MainFrameLayout,fragmentA,"YOUR_TARGET_FRAGMENT_TAG")
.addToBackStack("YOUR_SOURCE_FRAGMENT_TAG").commit();
【讨论】:
我在哪里使用此代码?在 FragmentPagerAdapter 的 getItem 中?【参考方案3】:您可以在活动布局 xml 文件中提供标签。
为android:tag attribute
提供一个唯一的字符串。
就像在布局 xml 中分配一个 id。
android:tag="unique_tag"
link to developer guide
【讨论】:
如果使用布局文件,这将起作用。但是这个问题是指在Java中动态设置标签。 这是我需要的答案,因为有时在使用某些库时,您无法控制片段事务,因此您无法以编程方式设置标签。谢谢!【参考方案4】:你也可以像这样获取所有片段:
适用于 v4 片段
List<Fragment> allFragments = getSupportFragmentManager().getFragments();
对于 app.fragment
List<Fragment> allFragments = getFragmentManager().getFragments();
【讨论】:
【参考方案5】:这是我找到的最好方法:
public class MainActivity extends AppCompatActivity
@Override
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
if (savedInstanceState == null)
// Let's first dynamically add a fragment into a frame container
getSupportFragmentManager().beginTransaction().
replace(R.id.flContainer, new DemoFragment(), "SOMETAG").
commit();
// Now later we can lookup the fragment by tag
DemoFragment fragmentDemo = (DemoFragment)
getSupportFragmentManager().findFragmentByTag("SOMETAG");
【讨论】:
【参考方案6】:如果您使用DialogFragment
(不是Fragment
),现在有一种更简单的方法可以实现这一点:
val yourDialogFragment = YourDialogFragment()
yourDialogFragment.show(
activity.supportFragmentManager,
"YOUR_TAG_FRAGMENT"
)
在底层,show()
方法确实创建了一个FragmentTransaction
并使用add()
方法添加了标签。但在我看来,使用show()
方法要方便得多。
您也可以使用Kotlin Extension 将其缩短为Fragment
:)
【讨论】:
【参考方案7】:我知道已经是 6 年前了,但如果有人遇到同样的问题,请像我一样做:
使用标签字段创建自定义Fragment
类:
public class MyFragment extends Fragment
private String _myTag;
public void setMyTag(String value)
if("".equals(value))
return;
_myTag = value;
//other code goes here
在将片段添加到sectionPagerAdapter
之前,请像这样设置标签:
MyFragment mfrag= new MyFragment();
mfrag.setMyTag("TAG_GOES_HERE");
sectionPagerAdapter.AddFragment(mfrag);
【讨论】:
问题不在于在片段上设置属性。 It was about being able to retrieve an existing Fragment instance without keeping a reference around. @Th3Wolf,谢谢。你的回答解决了我的问题....【参考方案8】:您可以将标记添加为Fragment
参数的属性。如果片段被销毁然后由OS重新创建,它将自动恢复。
示例:-
final Bundle args = new Bundle();
args.putString("TAG", "my tag");
fragment.setArguments(args);
【讨论】:
我明白你的意思。谢谢! 你得到了什么?!这不是你为 Fragment 设置标签的方式,而不是远景 这不是你设置标签的方式。以上是关于如何通过代码设置片段标签?的主要内容,如果未能解决你的问题,请参考以下文章
如何通过 viewModels 获取 viewModel? (片段-ktx)