2012-07-03 3 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> 

Почти каждый пост я мог бы найти сказал, что очистка проект помог решить эту проблему, но не в этом случае.

EDIT: ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ

Я использую фрагменты, и это мой фрагмент кода

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 прекрасными в фрагменте, но не тогда, когда мне нужно вернуться к активности.

Я могу проверить, что представление не является нулевым, оно печатает отлично, когда в методе вызывается toString.

Решение: Никогда не осознавали, что мне нужно было использовать основной вид, подумал, что я ПОДДЕРЖИВАЮ, чтобы использовать представление кнопки. Я очень новичок в этом (начал сегодня), спасибо всем за вклад!

+0

Вы вызывали 'setContentView()' перед вызовом 'findViewById'? –

+0

paast весь ваш код активности, ваше представление равно null –

+0

Вы уверены, что 'encode()' вызывается с помощью View, используя макет, который вы указали? –

ответ

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

view Параметр в методе обратного вызова encode(View view) в коде Java поставляется с Button самой точки зрения, но не Activity.

См Ссылка ниже:

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

1

Fragment s не получают onClick сек методы, которые объявлены в XML. Вы должны определить encode в своем Activity, а затем направьте нужное поведение на соответствующий Fragment. Раздражает, но так оно и делается. Я предлагаю вам просто реализовать программный код OnClickListener в коде Fragment, чтобы избежать переплетения поведения вашего фрагмента и активности.

+0

Вот что я сделал для этого. Я объявил кодировку в этой операции. Возможно, мне придется просто делать это программно, но не может найти другого способа. – kingdamian42

+0

Лучше всего держать все свое поведение в самом «Фрагменте». Лично я считаю, что разработчики фреймворка испортили материал 'onClick' ... кажется действительно глупым, чтобы перенаправить поведение обратно из Activity. Это полностью реализует его в вашем «Фрагменте» программным способом. –