0

我有一个可以在任何地方添加的“计时器”片段。在片段中,我以编程方式更改了一个 textView,它运行得很漂亮。我的问题是,在它下面的另一种方法中使用构造函数膨胀的布局中的视图(?不确定这是否是正确的术语)。

public class Timer_fragment extends android.support.v4.app.Fragment {
    int testpins;
    String testedpin;
    TextView text;  
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.timer_frag, container, false);

    TextView text = (TextView) v.findViewById(R.id.pwd_status);
    text.setText("Setting text in fragment not main");
    /* set the TextView's text, click listeners, etc. */
    updateStatus();
    return v;
}

所有这些代码都可以正常工作,但是当我尝试添加此方法时:

private void updateStatus() {
            TextView text = (TextView) findViewById(R.id.pwd_status);
            testPin();

            text.setText(testedpin);                         
        }

我在 findViewById 下得到一条红线The method findViewById(int) is undefined for the type Timer_fragment

我想过在我所有的方法中夸大视图而不是返回它们,但这肯定会以某种方式影响性能,对吧?

刚刚尝试在使用视图之前膨胀布局,但我收到一个错误,inflatercontainer说它们无法解决。

我这样做对吗?

4

3 回答 3

4

您的 Fragment 范围内已经有一个名为text. 不要在您的方法中重新声明它,只需分配它。

text = (TextView) v.findViewById(R.id.pwd_status);

private void upateStatus() {
        testPin();
        text.setText(testedpin);                         
    }
于 2012-07-30T13:34:16.683 回答
1

方法“findViewById”由活动提供。虽然此类扩展了 Fragment,但您将无法访问与活动相关的方法调用,除非您将活动提供给片段。查看: http: //developer.android.com/reference/android/app/Activity.html#findViewById (int )

基本上,要么将活动实例传递给 Timer_fragment:

private final Activity _activity;

Timer_fragment(Activity activity)
{
    _activity = activity;
}
...

private void updateStatus()
{
    TextView text = (TextView) _activity.findViewById(R.id.pwd_status);
    testPin();

    text.setText(testedpin);                         
} 

或者从正在使用的任何活动中设置视图的文本,而不是从计时器类中。

于 2012-07-30T13:32:11.533 回答
0

只需替换findViewByIdgetActivity().findViewById.

findViewById 方法是在 Activity 类中定义的。片段不是活动。但是片段可以使用 getActivity 方法获得对将其添加到屏幕的 Activity 的引用。

于 2013-10-02T08:58:04.147 回答