0

Я хочу позвонить ShowProductDetailFragment из домашнего фрагмента, но когда я звоню FragmentTransaction Я получаю NullPointerException. Вот журнал ошибок:NullPointer Исключение при замене фрагмента в android

06-24 21:35:21.484: E/AndroidRuntime(11633): FATAL EXCEPTION: main 
06-24 21:35:21.484: E/AndroidRuntime(11633): Process: org.nick.yarntrading, PID: 11633 
06-24 21:35:21.484: E/AndroidRuntime(11633): java.lang.NullPointerException 
06-24 21:35:21.484: E/AndroidRuntime(11633): at org.nick.yarntrading.Home.callproductDetails(Home.java:63) 
06-24 21:35:21.484: E/AndroidRuntime(11633): at org.nick.card_view.DataListAdapter$1.onClick(DataListAdapter.java:90) 
06-24 21:35:21.484: E/AndroidRuntime(11633): at android.view.View.performClick(View.java:4463) 
06-24 21:35:21.484: E/AndroidRuntime(11633): at android.view.View$PerformClick.run(View.java:18770) 
06-24 21:35:21.484: E/AndroidRuntime(11633): at android.os.Handler.handleCallback(Handler.java:808) 
06-24 21:35:21.484: E/AndroidRuntime(11633): at android.os.Handler.dispatchMessage(Handler.java:103) 
06-24 21:35:21.484: E/AndroidRuntime(11633): at android.os.Looper.loop(Looper.java:193) 
06-24 21:35:21.484: E/AndroidRuntime(11633): at android.app.ActivityThread.main(ActivityThread.java:5292) 
06-24 21:35:21.484: E/AndroidRuntime(11633): at java.lang.reflect.Method.invokeNative(Native Method) 
06-24 21:35:21.484: E/AndroidRuntime(11633): at java.lang.reflect.Method.invoke(Method.java:515) 
06-24 21:35:21.484: E/AndroidRuntime(11633): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:824) 
06-24 21:35:21.484: E/AndroidRuntime(11633): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:640) 
06-24 21:35:21.484: E/AndroidRuntime(11633): at dalvik.system.NativeStart.main(Native Method) 

вот Home класс, откуда я получаю ошибку

import android.annotation.SuppressLint; 
import android.app.Activity; 
import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentActivity; 
import android.support.v4.app.FragmentTransaction; 
import android.support.v7.widget.PopupMenu.OnMenuItemClickListener; 
import android.view.LayoutInflater; 
import android.view.Menu; 
import android.view.MenuInflater; 
import android.view.MenuItem; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ListView; 
import android.widget.RelativeLayout; 
import org.nick.card_view.DataListAdapter; 


public class Home extends Fragment implements OnMenuItemClickListener{ 
App a; 
ListView card_list; 
DataListAdapter adapter; 
RelativeLayout prodctView; 
Activity act; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    a =(App)getActivity().getApplication(); 
    act = getActivity(); 
} 
@SuppressLint("InflateParams") @Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

    prodctView = (RelativeLayout)inflater.inflate(R.layout.home_listview,null); 
     card_list = (ListView)prodctView.findViewById(android.R.id.list); 
    adapter = new DataListAdapter(a,getActivity().getSupportFragmentManager()); 
    card_list.setAdapter(adapter); 

    return prodctView; 
} 
@Override 
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
    // TODO Auto-generated method stub 
    super.onCreateOptionsMenu(menu, inflater); 
    inflater.inflate(R.menu.main, menu); 
} 
@Override 
public boolean onMenuItemClick(MenuItem arg0) { 
    // TODO Auto-generated method stub 
    return false; 
} 
public void callproductDetails() 
{ 

    Fragment d = new ShowProductDetail(); 
    FragmentTransaction ft =getActivity().getSupportFragmentManager().beginTransaction(); 
    ft.setCustomAnimations(R.anim.slide_right, android.R.anim.slide_out_right, 
      android.R.anim.slide_in_left, android.R.anim.slide_out_right); 
    ft.replace(R.id.frame, d); 
    ft.commit(); 
} 
@Override 
public void onResume() { 
    // TODO Auto-generated method stub 
    super.onResume(); 
    if(!((App)getActivity().getApplication()).fragmentStack.contains(this)) 
     ((App)getActivity().getApplication()).fragmentStack.add(this); 
} 
public void redirect() 
{ 
    FragmentTransaction ft = ((FragmentActivity) act).getSupportFragmentManager().beginTransaction(); 
    ft.setCustomAnimations(R.anim.slide_right,android.R.anim.slide_out_right); 
    ft.replace(R.id.frame, a.fragmentStack.lastElement()).commit(); 
} 

} 

Я зову callproductDetails() метод из DataListAdapter класса на view.setOnclickListener метода. Любая идея оценивается. Спасибо заранее ...

+3

Вы пытались использовать 'getChildFragmentManager()' вместо 'getActivity(). GetSupportFragmentManager()'? –

+0

И почему вы вызываете метод из Fragment в Adapter, потому что отправляете объект FragmentManager классу Adapter, поэтому просто переместите метод 'callproductDetails' в класс адаптера –

ответ

0

Ну, в принципе, я бы не рекомендовал использовать

getActivity() 

как ваш контекст для getSupportFragmentManager, так как getActivity() может легко возвращать нулевое значение и бросить NullPointerException.

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

if (getActivity() != null) 

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

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