2012-07-30 41 views
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

您的分段范围内已经有一个名为text的成员变量。不要在你的方法中重新声明它,只是分配它。

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

private void upateStatus() { 
     testPin(); 
     text.setText(testedpin);       
    } 
+0

是的,我的问题只是访问视图。 – EGHDK 2012-07-30 16:11:55

1

该方法'findViewById'由活动提供。虽然此类扩展了片段,但除非您将活动提供给片段,否则您将无法访问与活动相关的方法调用。退房: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);       
} 

或者从设置视图的文本中取其正在使用的活动,而不是从内定时器类。

+0

由于我将重复使用这个片段,并且它有很多其他方法。你是否建议我只传入所有其他方法的实例? – EGHDK 2012-07-30 13:38:00

+0

如果您将实例传递给构造函数,则Timer_Fragment类将通过成员变量在其所有方法中访问它(您不必在此之后将其传递到任何位置)。然而,它关于你正在尝试做什么。你需要多久调用一次updateStatus(),例如:你可以使用@Sparky的答案,并在其他地方完成工作? – Noah 2012-07-30 13:57:29

0

getActivity().findViewById只需更换findViewById

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

+0

是啊!它非常有帮助的答案 – 2013-10-02 08:59:21