2015-06-10 4 views
-1

У меня есть приложение в магазине Google Play. Я получаю уведомления о сбоях через Crashlytics/Fabric, поэтому у меня нет истинного LogCat для ссылки. Кроме того, я не могу понять, как копировать эту ошибку в моей собственной системе.OnCreateView NullPointerException

Ошибка я получаю от Crashlytics выглядит следующим образом:

com.company.appname.Fragment.onCreateView (Fragment.java:48)

Вот уместна деталь для декларация класса:

import android.support.v4.app.Fragment; 
public class MyTypeFragment extends Fragment {... 

Вот код из той части фрагмента:

44 mRestartButton = (Button)contentView.findViewById(R.id.restart_button); 
45 mRestartButton.setTypeface(regularTf); 
46 mRestartButton.setOnClickListener(new View.OnClickListener() { 
47  @Override 
48  public void onClick(View v) { 
49   getFragmentManager().popBackStack("startingFragment", 0); 
50  } 
51 }); 

Я нахожу интересным, что отчет о сбое в объявлении аварии как в методе onCreateView(), но линия 48 является декларация onClick() метода на моей кнопки он onClickListener.

Я посмотрел на следующие вопросы:

Оба они, кажется, указывают на проблему имеющие отношение к неправильному id при доступе к XML для этого фрагмент. Я не думаю, что это проблема, однако, как это XML-часть для этого фрагмента (и есть только один макет для этого фрагмента):

<LinearLayout 
    android:layout_height="match_parent" 
    android:layout_width="match_parent" 
    android:orientation="vertical" 

    > 

    <Button 
     android:id="@+id/restart_button" 
     android:layout_gravity="right" 
     android:layout_height="wrap_content" 
     android:layout_width="wrap_content" 
     android:paddingBottom="8dp" 
     android:paddingTop="8dp" 
     android:text="Restart" 

     /> 

Одна вещь, которая может представлять интерес: я использую этот же парадигма на многих моих фрагментах. Функция приложения состоит в том, чтобы развернуть ряд вопросов, чтобы получить ответ. Кнопка «Сброс» позволяет им полностью вернуться к началу, не проходя через какие-либо промежуточные фрагменты, которые они видели на этом пути. У каждого из этих фрагментов есть кнопка, которая называется с R.id.reset_button. Однако, как я уже сказал, я попытался воспроизвести эту проблему на своем конце и не могу понять, как это происходит.

Я прочитал кое-что, что указывает на то, что эта проблема может быть связана с фрагментом, каким-то образом отделенным от его деятельности, но я даже попытался оставить свое приложение и вернуться, но до сих пор не могу реплицировать эту ошибку.

+0

... или, может быть, макеты являются специфичными для платформы ... с информацией, которую вы предоставили, невозможно ответить на этот вопрос ... – Selvin

+0

@Selvin Я не понимаю, что вы подразумеваете под этим комментарием. Не могли бы вы рассказать? У меня есть только один макет для каждого фрагмента. Как платформа изменит материю? – mbm29414

+0

http://developer.android.com/guide/practices/screens_support.html#qualifiers <у вас есть? (или другие, такие как layout-vXX) – Selvin

ответ

0

Я предполагаю, что код работает на многих устройствах, и ошибка не легко воспроизводится. Единственная рекомендация, которая у меня есть, и это мой собственный метод кодирования, заключается в перемещении опубликованного кода на onViewCreated() вместо onCreateView(). Причина в том, что иногда onCreateView не смог закончить обработку графического интерфейса во времени. По крайней мере, это легко попробовать. Удачи в тестировании с помощью разных устройств.

Пример кода:

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    return inflater.inflate(R.layout.list_layout, container, false); 
} 

@Override 
public void onViewCreated(View view, Bundle savedInstanceState) { 
    Context thisContext = view.getContext(); 

    mRestartButton = (Button) view.findViewById(R.id.restart_button); 
    mRestartButton.setTypeface(regularTf); 
    mRestartButton.setOnClickListener(new View.OnClickListener() { 
    ... 

Примечания:

  • onCreateView() изменяется только возвращая вид корня, чтобы перейти на onViewCreated()
  • onViewCreated() теперь делает пользовательский интерфейс Работа.
+0

Каковы последствия этого? Как мне это сделать? Я все еще связываю/заполняю переменные пользовательского интерфейса моего класса в 'onCreateView()', или все ** ** переводится в 'onViewCreated()'? – mbm29414

+0

@ mbm29414, я добавил пример кода на мое сообщение и заметки. Как вы можете видеть, мало что изменилось. –

+0

Спасибо за обновление. Что я буду использовать в качестве замены переменной 'contentView', которую я создаю, используя inflater в' onCreateView() '? Является ли это, что 'View view 'передано' onViewCreated() ', или мне нужно получить/создать его каким-то другим способом? – mbm29414

Смежные вопросы