2015-12-23 3 views
2

Я знаю, что это дубликат вопрос, но я не могу найти правильный на мне Я пытаюсь отправить некоторые данные из моего OrderMadeFragment в OrderTakenFragment, но я не в состоянииИсключение нулевого указателя фрагмента

вот мои классы

OrderMadeFragment

import android.content.SharedPreferences; 
import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.ListView; 
import android.widget.Toast; 

/** 
* on 12/22/2015. 
*/ 
public class OrderMadeFragment extends Fragment 
{ 
    SharedPreferences sh_pref; 
    SharedPreferences.Editor toEdit; 
    Button b; 
    EditText e; 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
    { 
     View rootView = inflater.inflate(R.layout.fragment_order_made, container, false); 
     sh_pref=getContext().getSharedPreferences("start", getContext().MODE_PRIVATE); 
     toEdit = sh_pref.edit(); 
     b=(Button)rootView.findViewById(R.id.button); 
     e=(EditText)rootView.findViewById(R.id.editText); 

     b.setOnClickListener(new View.OnClickListener() 
     { 
      @Override 
      public void onClick(View v) 
      { 
       String qv=e.getText().toString(); 
       OrderTakenFragment ldf = new OrderTakenFragment(); 
       Bundle args = new Bundle(); 
       args.putString("YourKey", qv); 
       ldf.setArguments(args); 
       Log.e("args", args.toString()); 

//Inflate the fragment 
       getFragmentManager().beginTransaction().add(R.id.container, ldf).commit(); 
      } 
     }); 
     return rootView; 
    } 
} 

OrderTakenFragment

import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ListView; 
import android.widget.TextView; 
import android.widget.Toast; 

/** 
* Created by on 12/22/2015. 
*/ 
public class OrderTakenFragment extends Fragment 
{ 
    TextView v; 
    String bn="abc"; 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
    { 
     View rootView = inflater.inflate(R.layout.fragment_order_taken, container, false); 
     v=(TextView)rootView.findViewById(R.id.textView); 
//  String value = getArguments().getString("YourKey"); 
     // Log.e("YourKey",value); 
     v.setOnClickListener(new View.OnClickListener() 
     { 
      @Override 
      public void onClick(View v) 
      { 
       bn = getArguments().getString("YourKey"); 
      Toast.makeText(getActivity(),bn,Toast.LENGTH_LONG).show(); 
      } 
     }); 


     return rootView; 
    } 
} 

Logcat Ошибка

12-23 11:17:11.811 10669-10669/com.example.qualwebs.test E/args: Bundle[{YourKey=Name}] 
12-23 11:17:16.212 10669-10669/com.example.qualwebs.test E/AndroidRuntime: FATAL EXCEPTION: main 
Process: com.example.qualwebs.test, PID: 10669 
java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.os.Bundle.getString(java.lang.String)' on a null object reference 
    at com.example.qualwebs.test.OrderTakenFragment$1.onClick(OrderTakenFragment.java:31) 
    at android.view.View.performClick(View.java:4785) 
    at android.view.View$PerformClick.run(View.java:19884) 
    at android.os.Handler.handleCallback(Handler.java:746) 
    at android.os.Handler.dispatchMessage(Handler.java:95) 
    at android.os.Looper.loop(Looper.java:135) 
    at android.app.ActivityThread.main(ActivityThread.java:5343) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:372) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:907) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:702) 

Я последовал How to send data from one Fragment to another Fragment? ссылку

+0

'Попытка вызвать виртуальный метод«java.lang.String android.os.Bundle.getString (java.lang.String) '' –

+0

может сказать, что я делаю неправильно Я знаю, что такое ошибка –

+0

Почему' getArguments() '? –

ответ

1

Убедитесь, что TextView v имеет:

android:clickable="true" 

В ваших фрагментов OrderMadeFragment`:

FragmentManager fragmentManager = getActivity().getSupportFragmentManager(); 

еще лучше создать функцию в содержащей активность:

public void replaceFragment(Fragment fragment) { 
    fragmentTransaction = fragmentManager.beginTransaction(); 
    fragmentTransaction.replace(R.id.TheID, fragment); 
    fragmentTransaction.commit(); 
} 

Затем с использованием фрагмента:

((ContainingActivity) getActivity()).replaceFragment(fragment); 

Таким образом, вы можете управлять обратно стека и контролировать приложение навигации.

Вам необходимо управлять аргументами фрагмента.

static final String YOUR_KEY = "YourKey"; 

private String key_; 

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


public static OrderTakenFragment newInstance(String key_) { 
    OrderTakenFragment fragment = new OrderTakenFragment(); 
    Bundle args = new Bundle(); 
    args.putString(YOUR_KEY, key_); 
    fragment.setArguments(args); 
    return fragment; 
} 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    if (getArguments() != null) { 
     key_ = getArguments().getString(YOUR_KEY); 
    } 
} 

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
{ 
    View rootView = inflater.inflate(R.layout.fragment_order_taken, container, false); 
    v=(TextView)rootView.findViewById(R.id.textView); 
    v.setOnClickListener(new View.OnClickListener() 
    { 
     @Override 
     public void onClick(View v) 
     { 
      if(key_!=null) 
      Toast.makeText(getActivity(),key_,Toast.LENGTH_LONG).show(); 
     } 
    }); 


    return rootView; 
} 
+0

на тосте Я получаю нуль –

+0

@pritishjoshi посмотрите на мое редактирование –

+0

Все еще получаю null –

2

Вы должны запросить аргументы в OnCreate() вашего OrderTakenFragment

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

    if(getArguments()!=null) 
     value = getArguments().getString("YourKey"); 

} 

Затем в onCreateView(), под OnClick()

v.setOnClickListener(new View.OnClickListener() 
    { 
     @Override 
     public void onClick(View v) 
     { 
      // Use the variable value in your toast 
      if(value!=null) 
      Toast.makeText(getActivity(),value,Toast.LENGTH_LONG).show(); 
     } 
    }); 
+0

Я получаю нуль с другой стороны в своем фрагменте, где я хочу получить доступ к данным –

+0

Можете ли вы подтвердить, что вы не отправляете null в качестве аргументов ... и что вы получаете в аргументе onCreate null OrderTakenFragment.? –

+0

Я пытаюсь getArguments в общедоступном виде onCreateView (LayoutInflater inflater, контейнер ViewGroup, Bundle savedInstanceState) –

0

U должны получить данные, поступающие из фрагмента в связке, как это:

Bundle bundle = this.getArguments(); 
bn = bundle.getString("YourKey", "abc"); 
+0

все еще получает нуль –

0

Я хотел бы написать это сообщение как ответ.

Прежде всего, я думаю, что вы хотите заменить OrderMadeFragmentOrderTakenFragment на такую ​​же активность.

Попробуйте изменить эту строку:

getFragmentManager().beginTransaction().add(R.id.container, ldf).commit();

To: getActivity().getSupportFragmentManager().beginTransaction().replace(R.id.container, ldf).commit();

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