0

Мое приложение содержит навигатор. И внутри этого есть один фрагмент элемента. В этом фрагменте я попытался реализовать три события нажатия кнопки, чтобы открыть 3 действия. Но всякий раз, когда я нажимаю на фрагмент из ящика навигации, приложение вылетает с помощью nullPointerAcception. После отладки он показывает проблемы с приведенным ниже кодом, содержащим onClickListener:Ошибка приложения после нажатия кнопки на фрагментах

itemButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Intent itemIntent=new Intent(getActivity(),ItemsActivity.class); 
       startActivity(itemIntent); 
      } 
     }); 

Вот мой код фрагмента.

import android.content.Intent; 
import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.Button; 


/** 
* A simple {@link Fragment} subclass. 
*/ 
public class ItemsFragment extends Fragment { 

    Button itemButton; 
    Button categoryButton; 
    Button discountButton; 

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


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


     itemButton=(Button) container.findViewById(R.id.items_button); 
     categoryButton=(Button) container.findViewById(R.id.category_button); 
     discountButton=(Button) container.findViewById(R.id.discount_button); 

     itemButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Intent itemIntent=new Intent(getActivity(),ItemsActivity.class); 
       startActivity(itemIntent); 
      } 
     }); 

     setHasOptionsMenu(false); 
     // Inflate the layout for this fragment 
     return inflater.inflate(R.layout.fragment_items, container, false); 
    } 

} 

// Ошибка Logcat

E/AndroidRuntime: FATAL EXCEPTION: main 
        java.lang.NullPointerException 
         at com.soumya.possystem.ItemsFragment.onCreateView(ItemsFragment.java:36) 
         at android.support.v4.app.Fragment.performCreateView(Fragment.java:2080) 
         at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1108) 
         at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1290) 
         at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:801) 
         at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1677) 
         at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:536) 
         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) 
+0

что исключение? –

+0

Просьба указать исключение stacktrace из logcat. –

+0

Возможный дубликат [К сожалению, MyApp остановлен. Как я могу это решить?] (Http://stackoverflow.com/questions/23353173/unelcome-myapp-has-stopped-how-can-i-solve-this) –

ответ

4

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

Другой способ это взять экземпляр (findviewById) в onViewCreated или onActivityCreated

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

View v=inflater.inflate(R.layout.fragment_items, container, false); 

Ниже я сохранил код с изменениями.

import android.content.Intent; 
    import android.os.Bundle; 
    import android.support.v4.app.Fragment; 
    import android.view.LayoutInflater; 
    import android.view.View; 
    import android.view.ViewGroup; 
    import android.widget.Button; 


    /** 
    * A simple {@link Fragment} subclass. 
    */ 
    public class ItemsFragment extends Fragment { 

     Button itemButton; 
     Button categoryButton; 
     Button discountButton; 

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


     @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, 
           Bundle savedInstanceState) { 
    View v=inflater.inflate(R.layout.fragment_items, container, false); 
    //check in place of container here you need to use inflated view (`v`) instance 
      itemButton=(Button) v.findViewById(R.id.items_button); 
      categoryButton=(Button) v.findViewById(R.id.category_button); 
      discountButton=(Button) v.findViewById(R.id.discount_button); 

      itemButton.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        Intent itemIntent=new Intent(getActivity(),ItemsActivity.class); 
        startActivity(itemIntent); 
       } 
      }); 

      setHasOptionsMenu(false); 
      // Inflate the layout for this fragment 
      return v; 
     } 

    } 
+0

вы можете указать конкретный код, где он не работает –

+0

@jiteshmohite, пожалуйста, проверьте код и комментарий, который я сохранил, где именно NullPointerException давая крах – user1140237

+0

okey теперь вы отредактировали спасибо –

1

Вы должны инициализировать вид в соответствии с требованием:
Create a Fragment Class

Так что вы должны сделать
View view = inflater.inflate(R.layout.YOUR_LAYOUT, container, false);
и затем
itemButton=(Button) view.findViewById(R.id.items_button);

0

Попробуйте

View rootView = inflater.inflate(R.layout.fragment_id, container, false); 
    itemButton=(Button) container.findViewById(R.id.items_button); 
    categoryButton=(Button) container.findViewById(R.id.category_button); 
    discountButton=(Button) container.findViewById(R.id.discount_button); 
. 
. 
. 

    return rootView; 
0

Попробуйте это:

public class ItemsFragment extends Fragment { 

Button itemButton; 
Button categoryButton; 
Button discountButton; 

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


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

@Override 
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 
    super.onViewCreated(view, savedInstanceState); 
    itemButton=(Button) view.findViewById(R.id.items_button); 
    categoryButton=(Button) view.findViewById(R.id.category_button); 
    discountButton=(Button) view.findViewById(R.id.discount_button); 

    itemButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Intent itemIntent=new Intent(getActivity(),ItemsActivity.class); 
      startActivity(itemIntent); 
     } 
    }); 

} 
} 
1
public class ItemsFragment extends Fragment { 

    Button itemButton; 
    Button categoryButton; 
    Button discountButton; 

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


    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
    /** Inflate rootView of fragment **/ 
    View rootView = inflater.inflate(R.layout.fragment_items, container, false); 

     //replace "container" with "rootView" **/ 
     itemButton=(Button) rootView.findViewById(R.id.items_button); 
     categoryButton=(Button) rootView.findViewById(R.id.category_button); 
     discountButton=(Button) rootView.findViewById(R.id.discount_button); 

     itemButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Intent itemIntent=new Intent(getActivity(),ItemsActivity.class); 
       startActivity(itemIntent); 
      } 
     }); 

     setHasOptionsMenu(false); 
     // Inflate the layout for this fragment 
     return rootView; // Return the view object you inflated 
    } 

} 
+0

Я предлагаю вам продолжить объяснение проблемы. поэтому пользователь может понять проблему – user1140237