【发布时间】:2011-09-16 11:31:15
【问题描述】:
我在Fragment 类中没有找到类似setTag(String tagName) 的方法。我发现设置Fragment 标签的唯一方法是执行FragmentTransaction 并将标签名称作为参数传递。
这是通过代码显式设置Fragment标签的唯一方法吗?
【问题讨论】:
标签: android android-3.0-honeycomb android-fragments
我在Fragment 类中没有找到类似setTag(String tagName) 的方法。我发现设置Fragment 标签的唯一方法是执行FragmentTransaction 并将标签名称作为参数传递。
这是通过代码显式设置Fragment标签的唯一方法吗?
【问题讨论】:
标签: android android-3.0-honeycomb android-fragments
是的。所以唯一的方法是在交易时,例如使用add、replace,或作为布局的一部分。
我通过检查兼容性来源确定了这一点,因为我在过去的某个时间短暂地寻找过类似的东西。
【讨论】:
你可以这样设置tag到fragment:
Fragment fragmentA = new FragmentA();
getFragmentManager().beginTransaction()
.replace(R.id.MainFrameLayout,fragmentA,"YOUR_TARGET_FRAGMENT_TAG")
.addToBackStack("YOUR_SOURCE_FRAGMENT_TAG").commit();
【讨论】:
您可以在活动布局 xml 文件中提供标签。
为android:tag attribute 提供一个唯一的字符串。
就像在布局 xml 中分配一个 id。
android:tag="unique_tag"
【讨论】:
你也可以像这样获取所有片段:
适用于 v4 片段
List<Fragment> allFragments = getSupportFragmentManager().getFragments();
对于 app.fragment
List<Fragment> allFragments = getFragmentManager().getFragments();
【讨论】:
这是我找到的最好方法:
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");
}
}
}
【讨论】:
如果您使用DialogFragment(不是Fragment),现在有一种更简单的方法可以实现这一点:
val yourDialogFragment = YourDialogFragment()
yourDialogFragment.show(
activity.supportFragmentManager,
"YOUR_TAG_FRAGMENT"
)
在底层,show() 方法确实创建了一个FragmentTransaction 并使用add() 方法添加了标签。但在我看来,使用show() 方法要方便得多。
您也可以使用Kotlin Extension 将其缩短为Fragment :)
【讨论】:
我知道已经是 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);
【讨论】:
您可以将标记添加为Fragment 参数的属性。如果片段被销毁然后由OS重新创建,它将自动恢复。
示例:-
final Bundle args = new Bundle();
args.putString("TAG", "my tag");
fragment.setArguments(args);
【讨论】: