很简单,就是不懂。
我想通过我膨胀的 Fragments
XML 文件中的 ID 引用一个 View 。
我正在声明 View 。
TextView nameView;
我从布局中获取 View 。
View view = inflater.inflate(R.layout.trackfrag, group, false);
nameView = (TextView)view.findViewById(R.id.trackName);
当从它的 Activity 中调用时,我在下面的方法中遇到了问题。
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 View
中的文本。
添加 fragment 创建
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");
}
添加 fragment 方法
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();
}
最佳答案
您的问题在于调用 setTrackDetails() 方法。请看here你在哪里可以看到:
Calling commit() does not perform the transaction immediately. Rather, it schedules it to run on the activity's UI thread (the "main" thread) as soon as the thread is able to do so.
因此,就在您调用提交之后,您的 fragment 尚未创建或正在创建并且您的 nameView 尚未设置。 最好的解决方案是在创建 fragment 之后(可以在设置 nameView 之后,因为 fragment 已经有 Activity )从接受文本的 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);
请阅读有关 fragment 及其生命周期的文档。
关于android - 在布局中引用 View 时出现空指针错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11205860/