android - 在布局中引用 View 时出现空指针错误

标签 android android-fragments

很简单,就是不懂。 我想通过我膨胀的 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/

相关文章:

java - 使用 fragment 的 SherlockActionBar 中的进度条圆圈

java - 元素没有到达 fragment XML 中应有的位置

android - 进一步理解 setRetainInstance(true)

android - 工具栏android中的进度条颜色?

java - 下载并保存文件

java - Android studio [2.1]不显示 "Import class"

android - 如何检查 fragment 是否存在

android - 方法 getBitmapFromMemCache(String) 未定义

java - 配色库

java - Activity 销毁后自定义 ListView 不响应监听器