2015-03-25 2 views
-1

Когда я попытался получить доступ к текстовым изображениям во фрагменте, он бросает nullpointer exception.i объявили переменные и инициализировал его в onCreateView после того, как View завышен. я не знаю, почему он бросает ошибку,Фрагмент с использованием onCreateView вызывает исключение

Вот мой код

public class LoginTextHolder extends Fragment { 

private View view; 
EditText txtUsername; 
EditText txtPassword; 

public static LoginTextHolder newInstance() { 

    return new LoginTextHolder(); 
} 

public LoginTextHolder() { 
    // Required empty public constructor 
} 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 
    view = inflater.inflate(R.layout.fragment_login_text_holder, container, false); 
    txtUsername = (EditText) view.findViewById(R.id.txtUserName); 
    txtPassword = (EditText) view.findViewById(R.id.txtPassword); 
    return view; 
} 


@Override 
public void onAttach(Activity activity) { 
    super.onAttach(activity); 

} 

@Override 
public void onDetach() { 
    super.onDetach(); 
} 

public String[] giveData() { 
    String[] uNp = {"", ""}; 
    uNp[0] = txtUsername.getText().toString(); 
    uNp[1] = txtPassword.getText().toString(); 
    return uNp; 
} 

}

Вот мой LogCat выход

FATAL EXCEPTION: main 
java.lang.NullPointerException 
     at akshara.homeshop.fragments.LoginTextHolder.giveData(LoginTextHolder.java:65) 
     at akshara.homeshop.activities.LoginActivity.onLoginEventFragmentInteraction(LoginActivity.java:51) 
     at akshara.homeshop.fragments.LoginEventHandlers.onClick(LoginEventHandlers.java:76) 
     at android.view.View.performClick(View.java:4204) 
     at android.view.View$PerformClick.run(View.java:17355) 
     at android.os.Handler.handleCallback(Handler.java:725) 
     at android.os.Handler.dispatchMessage(Handler.java:92) 
     at android.os.Looper.loop(Looper.java:137) 
     at android.app.ActivityThread.main(ActivityThread.java:5041) 
     at java.lang.reflect.Method.invokeNative(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:511) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
     at dalvik.system.NativeStart.main(Native Method) 

Я пытался это исправить более 30 минут. Кто-нибудь знает, как исправить this.Any помощь будет оценена

Вот мой логин активность

public class LoginActivity extends FragmentActivity implements LoginEventHandlers.LoginEventFragmentInteractionListener { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_login); 
} 

@Override 
public void onLoginEventFragmentInteraction(View view) { 
    switch (view.getId()) { 
     case R.id.btnSignIn: 
      LoginTextHolder loginTextsFragment = LoginTextHolder.newInstance(); 

      Log.e("Sony", loginTextsFragment.giveData()[0]); 
      Log.e("Sony", loginTextsFragment.giveData()[1]); 
      break; 
     case R.id.lblSignUp: 
      Log.e("Sony", "SignUp"); 
      break; 
    } 

} 

}

Вот макет фрагмента

<RelativeLayout 
android:id="@+id/loginTextHolderRoot" 
xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="wrap_content" 
android:background="@android:color/white" 
android:padding="@dimen/holderDefaultPadding" 
tools:context="akshara.homeshop.fragments.LoginTextHolder"> 


<EditText 
    android:id="@+id/txtUserName" 
    style="@style/MyDefaultTextBoxStyle" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_marginTop="@dimen/defaultWidgetTopMargin" 
    android:hint="@string/userName"/> 

<EditText 
    android:id="@+id/txtPassword" 
    style="@style/MyDefaultTextBoxStyle" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_below="@+id/txtUserName" 
    android:layout_marginTop="@dimen/defaultWidgetTopMargin" 
    android:hint="@string/password" 
    android:inputType="textPassword"/> 

первое изображение от onCreateView, а следующее - от giveDatafrom give data![][1]

+0

Где вы звоните giveData? –

+0

Что такое «на akshara.homeshop.fragments.LoginTextHolder.giveData (LoginTextHolder.java:65)», разместите раскладку xml и вы сначала искали SO? –

+0

@EricS. он вызывает из активности (активность входа) – Sony

ответ

1

Перенесена инициализация на onActivityCreated(Bundle savedInstanceState). Это не безопасно для вызова управления фрагментами в onCreateView() всегда вызывать из onActivityCreated(Bundle savedInstanceState) и поблагодарить всех вас за ваше время

+1

Спасибо за хорошую информацию. В примере проекта из сети Google он создает представления пользовательского интерфейса в переопределении onViewCreated. Хотя onCreateView() возвращает только представление из xml inflate, например inflate (R.layout.fragment_sample ... –

+0

, пожалуйста, поместите ссылку на проект, если таковой имеется, так что это будет полезно для кого-то в будущем – Sony

+0

I добавила еще один ответ, так как вы спросили. Вы информативны и полезны, поэтому я постараюсь проверить ваши будущие должности. Спасибо, что выбрали мои ответы как полезные. Может быть, мы создадим хорошую команду SO, мой вдумчивый друг :-) –

2

Глядя на ваш StackTrace, это выглядит, как вы вызываете giveData слишком рано. Вы инициализировать

EditText txtUsername; 
EditText txtPassword; 

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

+0

Нет, это не так скоро, я ввел тексты в обоих полях, имени пользователя и пароле, а затем функция называется – Sony

+0

перенесла инициализацию в 'onActivityCreated (Bundle savedInstanceState)', и она решила проблему. спасибо за подсказку – Sony

1

Сначала мне нравится ваше сообщение, полное информации. Значение -1 для сообщения должно быть удалено.

Я думаю, что txtUsername (from giveData()) является нулевым, потому что вы возвращаете новый фрагмент в методе newInstance. И новый фрагмент не имеет ссылки на пользовательский интерфейс. Он нуждается в текущем фрагменте в правильном Контексте. Попробуйте следующее:

public static LoginTextHolder newInstance() { 

    return this; // return current instance of this fragment 
} 

Но обычно вам не нужно указывать newInstance с пустыми параметрами. Мощный FragmentManager может извлекать текущий фрагмент в контексте. И это помогает, что ваш код находится в FragmentActivity.

В то же время, давайте попробуем это первым.

+0

'this' не может вызываться из статического контекста. Это то, что я получил.Но я решил исключение, переместив инициализацию на 'onActivityCreated()' – Sony

1

Существует хорошая ссылка Google @SlidingTabsBasicFragment.java, который показывает, связанный хороший пример кода для выпуска воспитан на этом посту.

Фрагмент кода с веб-страницы:

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

    @Override 
    public void onViewCreated(View view, Bundle savedInstanceState) { 
     // Get the ViewPager and set it's PagerAdapter so that it can display items 
     mViewPager = (ViewPager) view.findViewById(R.id.viewpager); 
     mViewPager.setAdapter(new SamplePagerAdapter()); 

     // Give the SlidingTabLayout the ViewPager, this must be done AFTER the ViewPager has had 
     // it's PagerAdapter set. 
     mSlidingTabLayout = (SlidingTabLayout) view.findViewById(R.id.sliding_tabs); 
     mSlidingTabLayout.setViewPager(mViewPager); 
    } 

. Примечание:

  1. В переназначения onCreateView, он возвращает только вид из inflater.inflate (..., больше ничего
  2. В override onViewCreated, он создает/находит пользовательский интерфейс, и он делает больше, чем это. Этот метод возникает сразу после onCreateView. В этом случае из опубликованной проблемы время изменило.
  3. от Google, в соответствии с onViewCreated method, часть объяснения говорит:

Это дает подклассы возможность инициализировать себя, как только они знают их мнение иерархия была полностью создана.

Так что теперь я знаю и буду помнить ...

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