在我的应用中,我有多个相同片段的实例ActivityFragment
。在每个片段中,都有一个activity_text
文本视图。将片段添加到布局后,我想在activity_text
期间在该片段中设置onCreate
textview。但是,当我尝试执行此操作时,屏幕上的每个ActivityFragment
都会更改activity_text
文本视图。
有没有什么方法可以将setText
限制在单个片段的范围内而不为每个片段使用唯一的标签或ID?
这是我的ActivityFragment类:
public static class ActivityFragment extends Fragment {
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable final ViewGroup container, Bundle savedInstanceState) {
final View fragment1 = inflater.inflate(R.layout.activity_fragment, container, false);
final TextView activityText = (TextView) fragment1.findViewById(R.id.activity_text);
//Calling setText changes the activityText Textview in every fragment onscreen
activityText.setText(text);
return fragment1;
}
}
这是我的MainActivity类:
public class MainActivity extends FragmentActivity {
Static String text;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
for (int i = 0; i != 5; i++) {
//This ensures each fragment receives a unique String
text = "success" + i;
ActivityFragment myFragment = new ActivityFragment();
getFragmentManager().beginTransaction()
.add(R.id.fragment_container, myFragment).commit();
}
}
}
答案 0 :(得分:1)
您的代码看起来有两个问题。
首先,您使用// WILL NOT WORK
if (o1.getClass().equals(o2.getClass()) { // two Cars or two Apples
int x = comparison(o1.getClass(), o1, o2);
System.out.println(x);
)
static <T extends Comparable<T>> int comparison(Class<T> type, T o1, T o2) {
return type.cast(o1).compareTo(type.cast(o2));
}
将活动信息传输到碎片。一般来说,这不是一个好主意;如果您需要在构建时将某些内容从“活动”传递到“碎片”,则应使用static String text
来执行此操作。
第二,你似乎对Fragment.setArguments(Bundle)
的时间有误解。您的FragmentTransaction
循环会更改for
的值,然后text
将新片段更改五次。但这些事务是异步的,片段生命周期有自己的时间轴。因此,在您的活动.commit()
完成后,您的onCreateView()
实际上会被调用,因此您的五个片段中的每一个都会从onCreate()
获得相同的值。
以下是我如何解决它:
text
答案 1 :(得分:1)
您的问题与textview的范围无关。
每个片段都单独将textView设置为text
,正如您指示他们这样做的那样。之所以发生这种情况,是因为在所有片段事务发生之后,onCreateView被调用了很多。
在您的代码中,您放置了评论://This ensures each fragment receives a unique String
,实际上,没有什么可以确保片段正在接收任何内容。我建议你阅读static
在Java中的含义。在for-loop
上,您连续5次更改text
的值,最后一个值为&#34; success4&#34;。
将参数传递给片段的正确方法是通过Bundle
添加调用方法setArguments(Bundle)
我搜索过这里的答案https://stackoverflow.com/a/35737232/906362非常清楚地说明了如何做到这一点。要点是这样的:
for (int i = 0; i != 5; i++) {
ActivityFragment myFragment = new ActivityFragment();
Bundle b = new Bundle();
// This really ensures each fragment receives a unique String
b.putString("text", "success" + i)
myFragment.setArguments(b);
getFragmentManager().beginTransaction()
.add(R.id.fragment_container, myFragment).commit();
}
然后在片段上获取此值:
TextView activityText = (TextView) fragment1.findViewById(R.id.activity_text);
activityText.setText(getArguments().getString("text");