非常简单但却没有得到它。
我想通过ID引用一个视图,该视图位于我膨胀的Fragments
XML文件中。
我正在宣布这个观点。
TextView nameView;
我从布局中获取了视图。
View view = inflater.inflate(R.layout.trackfrag, group, false);
nameView = (TextView)view.findViewById(R.id.trackName);
当从活动中调用时,我在下面的方法中遇到了问题。
public void setTrackDetails (String name, String description) {
Log.e("TRACKFRAG", "setTrackDetails Called");
nameView.setText(name);
Log.e("TRACKFRAG", "setTrackDetails Finished");
}
非常感谢任何帮助。
添加XML
<TextView
android:id="@+id/trackName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_above="@id/anchor"
android:text="Track Name"
android:textAppearance="?android:attr/textAppearanceMedium"
android:textSize="22sp" />
如果我没有调用此方法,Fragment
会加载并显示正常,但我需要一种方法来更改其中一个Text Views
中的文本。
添加片段创作
public void onTrackSelected(String track) {
Log.e("FRAGTRANS","History List Pressed");
Fragment trackFrag = getFragmentManager().findFragmentByTag("historytrack");
if (trackFrag == null) {
trackFrag = new TrackFragment();
Log.e("TRACKSEL","new trackfrag created");
}
addFragment(trackFrag, true, HISTORYTAG, FragmentTransaction.TRANSIT_NONE);
((TrackFragment) trackFrag).setTrackDetails(track,"testing");
}
添加碎片方法
void addFragment(Fragment fragment, boolean addToBackStack, String tag, int transition) {
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.replace(android.R.id.content, fragment);
ft.setTransition(transition);
if (addToBackStack)
ft.addToBackStack(null);
ft.commit();
}
答案 0 :(得分:2)
您的问题在于调用setTrackDetails()方法。请查看here您可以在哪里看到:
调用commit()不会立即执行事务。相反,只要线程能够这样做,就会将其安排在活动的UI线程(“主”线程)上运行。
因此,在您调用提交之后,您的片段尚未创建或正在创建正在进行且您的nameView尚未设置。 最好的解决方案是在创建你的片段之后(可以在设置nameView后因为片段已经有活动)从带有文本的activity中调用方法:
View view = inflater.inflate(R.layout.trackfrag, group, false);
nameView = (TextView)view.findViewById(R.id.trackName);
String str = ((MyActivity)getActivity()).getTextForLabel();
nameView.setText(str);
请阅读有关片段及其生命周期的文档。
答案 1 :(得分:0)
你是不是像这样初始化你的inflater,
inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
检查一下。 清理你的项目并运行....
答案 2 :(得分:0)
我也遇到了这个问题。
您在上面提到的代码,只需在onActivityCreated()
类的Fragment
方法中编写该部分。这样我解决了这个问题。