2013-12-14 2 views
0

Я пытаюсь заменить существующий фрагмент на другой фрагмент. Я использую FrameLayout, чтобы я мог обменивать фрагменты.NullPointerException - Замена фрагмента в FrameLayout

Я должен установить некоторые данные в новый фрагмент, прежде чем показывать его. Но я получаю исключение NullPointerException.

Я довольно новичок в Фрагментах, поэтому, пожалуйста, помогите мне с этим. Я посмотрел на другие вопросы на SO, но я не мог решить мою проблему

Logcat :::

12-14 19:15:08.577: E/AndroidRuntime(10726): FATAL EXCEPTION: main 
12-14 19:15:08.577: E/AndroidRuntime(10726): java.lang.NullPointerException 
12-14 19:15:08.577: E/AndroidRuntime(10726): at com.xx.xxx.wallet.WalletNotRedeemedFragment.setParameters(WalletNotRedeemedFragment.java:29) 
12-14 19:15:08.577: E/AndroidRuntime(10726): at com.xx.xxx.wallet.WalletListActivity.onWalletListItemClick(WalletListActivity.java:70) 
12-14 19:15:08.577: E/AndroidRuntime(10726): at com.xx.xxx.wallet.WalletListFragment$1.onItemClick(WalletListFragment.java:108) 
12-14 19:15:08.577: E/AndroidRuntime(10726): at android.widget.AdapterView.performItemClick(AdapterView.java:298) 
12-14 19:15:08.577: E/AndroidRuntime(10726): at android.widget.AbsListView.performItemClick(AbsListView.java:1100) 
12-14 19:15:08.577: E/AndroidRuntime(10726): at android.widget.AbsListView$PerformClick.run(AbsListView.java:2788) 
12-14 19:15:08.577: E/AndroidRuntime(10726): at android.widget.AbsListView$1.run(AbsListView.java:3463) 
12-14 19:15:08.577: E/AndroidRuntime(10726): at android.os.Handler.handleCallback(Handler.java:730) 
12-14 19:15:08.577: E/AndroidRuntime(10726): at android.os.Handler.dispatchMessage(Handler.java:92) 
12-14 19:15:08.577: E/AndroidRuntime(10726): at android.os.Looper.loop(Looper.java:137) 
12-14 19:15:08.577: E/AndroidRuntime(10726): at android.app.ActivityThread.main(ActivityThread.java:5103) 
12-14 19:15:08.577: E/AndroidRuntime(10726): at java.lang.reflect.Method.invokeNative(Native Method) 
12-14 19:15:08.577: E/AndroidRuntime(10726): at java.lang.reflect.Method.invoke(Method.java:525) 
12-14 19:15:08.577: E/AndroidRuntime(10726): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) 
12-14 19:15:08.577: E/AndroidRuntime(10726): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
12-14 19:15:08.577: E/AndroidRuntime(10726): at dalvik.system.NativeStart.main(Native Method) 

Пожалуйста, посмотрите на код ниже ...

Bundle bundle = new Bundle(); 
    bundle.putString("imagepath", imagePath); 
    bundle.putString("title", title); 
    bundle.putString("desc", desc); 

    WalletNotRedeemedFragment frag = new WalletNotRedeemedFragment(); 
    frag.setParameters(bundle); 

    getSupportFragmentManager().beginTransaction() 
      .replace(R.id.wallet_detail_container, frag).commit(); 

WalletNotRedeemed .java

public class WalletNotRedeemedFragment extends SherlockFragment { 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 

     View view = inflater.inflate(R.layout.fragment_wallet_not_redeemed, 
       container, false); 
     return view; 
    } 

    public void setParameters(Bundle bundle) { 
    // Null Pointer Exception here... 
     TextView title = (TextView) getView().findViewById(
       R.id.textview_coupon_title_nr); 
     title.setText(bundle.getString("title")); 

     TextView desc = (TextView) getView().findViewById(
       R.id.textview_coupon_description_nr); 
     desc.setText(bundle.getString("desc")); 

     ImageView image = (ImageView) getView().findViewById(
       R.id.imageview_coupon_image_nr); 
     image.setImageURI(Uri.parse(bundle.getString("imagepath"))); 

    } 

} 

Из того, что я понял, рассматривая другие вопросы, является то, что фрагмент еще не загружен, и, следовательно, я получаю исключение NullPointerException, когда я пытаюсь получить доступ к TextView, но я не уверен, как заставить его работать.

Ваша помощь очень ценится .. спасибо !!!


Ответ :::

Я думаю, я получил его на работу .. но, это не может быть лучшим способом ...

Вот что я сделал ...

public class WalletNotRedeemedFragment extends SherlockFragment { 

    TextView title, desc; 
    ImageView image; 

    String strTitle, strDesc, strImage; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 

     View view = inflater.inflate(R.layout.fragment_wallet_not_redeemed, 
       container, false); 

     title = (TextView) view.findViewById(R.id.textview_coupon_title_nr); 
     title.setText(strTitle); 

     desc = (TextView) view 
       .findViewById(R.id.textview_coupon_description_nr); 
     desc.setText(strDesc); 

     image = (ImageView) view.findViewById(R.id.imageview_coupon_image_nr); 
     image.setImageURI(Uri.parse(strImage)); 

     return view; 
    } 

    public void setParameters(Bundle bundle) { 

     strTitle = bundle.getString("title"); 
     strDesc = bundle.getString("desc"); 
     strImage = bundle.getString("imagepath"); 

    } 

} 

ответ

0

Это потому, что onCreateView() метод вид вернулся.

В SetParameters метода вы ссылка GetView() найти идентификатор ваших элементов пользовательского интерфейса.

Меняем

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 

    View view = inflater.inflate(R.layout.fragment_wallet_not_redeemed, 
      container, false); 
    TextView title = (TextView) view .findViewById(
      R.id.textview_coupon_title_nr); 


    TextView desc = (TextView) view .findViewById(
      R.id.textview_coupon_description_nr); 


    ImageView image = (ImageView) view).findViewById(
      R.id.imageview_coupon_image_nr); 

    return view; 
} 

И SetParameters Митос:

public void setParameters(Bundle bundle) { 
// Null Pointer Exception here... 

    title.setText(bundle.getString("title")); 


    desc.setText(bundle.getString("desc")); 


    image.setImageURI(Uri.parse(bundle.getString("imagepath"))); 

} 
+0

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

+0

Извините, но теперь см. мой обновленный ответ по строчке ... прежде чем я назвал название.SetText (bundle.getString ("название")); desc.setText (bundle.getString ("desc")); image.setImageURI (Uri.parse (bundle.getString ("путь к изображению"))); также в методе onCreateView(). – Piyush

0

объявить все вид поля в методе OnCreateView

TextView title; 
    TextView desc; 
    ImageView image; 

    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 

    View view = inflater.inflate(R.layout.fragment_wallet_not_redeemed, 
      container, false); 

    title = (TextView) view.findViewById(
      R.id.textview_coupon_title_nr); 

    desc = (TextView) view.findViewById(
      R.id.textview_coupon_description_nr); 

    image = (ImageView) view.findViewById(
      R.id.imageview_coupon_image_nr); 

    return view; 
} 
+0

Я попробовал это, но я все еще получаю NullPointerException при попытке установить текст в методе SetParameters ... –

+0

@VamsiChalla может вы покажите мне строку № 29, где произошла ошибка – whizzzkey

+0

Я прокомментировал это в вопросе .. в методе setParameters .. при попытке доступа к TextView –

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