在布局中引用视图时出现空指针错误

时间:2012-06-26 10:58:11

标签: android android-fragments

非常简单但却没有得到它。 我想通过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();
    }

3 个答案:

答案 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方法中编写该部分。这样我解决了这个问题。