1

真的很简单,但就是不明白。我想通过 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();
    }
4

3 回答 3

2

您的问题在于调用 setTrackDetails() 方法。请看这里你可以看到:

调用 commit() 不会立即执行事务。相反,一旦线程能够这样做,它就会安排它在活动的 UI 线程(“主”线程)上运行。

因此,在您调用提交之后,您的片段尚未创建或正在创建,并且您的 nameView 尚未设置。最好的解决方案是在创建你的片段之后(可以在设置 nameView 之后,因为片段已经有活动)从接受文本的活动中调用方法:

View view = inflater.inflate(R.layout.trackfrag, group, false);
nameView = (TextView)view.findViewById(R.id.trackName);
String str = ((MyActivity)getActivity()).getTextForLabel();
nameView.setText(str);

请阅读有关片段及其生命周期的文档。

于 2012-06-27T07:29:40.400 回答
0

你有没有像这样初始化你的充气机,

     inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);

看一下这个。清理你的项目并运行....

于 2012-06-26T11:54:28.687 回答
0

我也遇到了这个问题。

您上面提到的代码,只需将那部分写onActivityCreated()在类的方法中即可Fragment。这样我就解决了问题。

于 2012-06-26T11:56:19.940 回答