2012-07-03 149 views
0

我正在使用一个按钮来调用将输入文本放入文本视图的方法。每当我使用findViewById,它都会返回null。Android findViewById返回null

public void encode(View view){ 
    TextView out = (TextView) view.findViewById(R.id.encoderout); 
    EditText in = (EditText) view.findViewById(R.id.encoderin); 
    out.setText(in.getText().toString()); 
    out.setTypeface(font); 
} 

我的XML是在这里

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
      android:orientation="vertical" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" 
    > 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/input" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_weight="1" 
    > 
    <EditText android:id="@+id/encoderin" 
     android:layout_width="0dp" 
     android:layout_weight="2" 
     android:layout_height="wrap_content" 
     android:hint="Text to encode"/> 
    <Button android:id="@+id/encoderbutton" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:onClick="encode" 
     android:text="Encode!"/> 
</LinearLayout> 
<TextView android:id="@+id/encoderout" 
    android:text="test" 
    android:layout_width="fill_parent" 
    android:layout_weight="1" 
    android:gravity="center" 
    android:layout_height="wrap_content"/> 
</LinearLayout> 

几乎每一个职位,我能找到的说,清理项目帮助解决这个问题,但不是在这种情况下。

编辑:附加信息

我使用的片段,这是我的片段代码

public static class Encoder extends Fragment{ 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.encoder, container, false);  
    return view; 
    } 
} 

它调用的成活动的,因为按钮的工作方式。我可以在片段中调用find方法,但不必在返回到活动时调用。

我可以验证该视图不是null,当方法中调用toString时它会打印出正确的。

解决方案:从来没有意识到我不得不使用主视图,认为我是SUPPOSE使用按钮视图。我很新(今天开始)谢谢大家的意见!

+0

在调用'findViewById'之前调用了'setContentView()'吗? –

+0

paast你所有的活动代码,你的看法是空的 –

+0

你确定'编码()'正在使用您显示的布局与视图调用? –

回答

3
<Button android:id="@+id/encoderbutton" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:onClick="encode" 
    android:text="Encode!"/> 

参数view在Java代码回调方法encode(View view)Button视图本身而不是Activity提供。

见下文参考:

http://developer.android.com/reference/android/widget/Button.html

1

Fragment■不要接收在XML声明onClick小号的方法。您需要在您的Activity中定义encode,然后将所需行为指向相应的Fragment。令人讨厌的,但这是它的方式。我建议你只需在Fragment代码中以编程方式实现OnClickListener,以避免纠结片段和活动的行为。

+0

这就是我所做的。我在活动中声明了编码。我可能不得不以编程方式做它,似乎无法找到另一种方式 – kingdamian42

+0

最好的做法是将所有行为保留在“片段”本身内。就我个人而言,我认为框架开发人员与'onClick'的东西搞砸了......似乎真的很愚蠢,不得不从行为中转回行为。代之以编程方式在你的'Fragment'中实现它是完全正确的。 –