簡體   English   中英

無法將數據從“活動”傳遞到片段。 得到NULL

[英]Unable to pass data from Activity to fragment. getting NULL

請幫助我,我使用導航抽屜和片段。當用戶按下登錄按鈕時,我會檢索用戶數據並將其發送到片段中的變量。 但是當調用fragment時,fragment中的變量值為null 值如何不能為null 下面是代碼:

public class RecyclerViewBookingFragment extends Fragment implements DatePickerDialog.OnDateSetListener {
    private static final String TAG = RecyclerViewBookingFragment.class.getSimpleName();
    private View dialogView;


    private LayoutInflater inflater;
    private AlertDialog.Builder dialog;
    private ProgressDialog pDialog;
    private Context context;
    private RecyclerView recyclerView;
    private SwipeRefreshLayout swipeRefreshLayout;
    private RecyclerViewBookingAdapter adapter;
    private List<Booking> bookingList = new ArrayList<>();
    private static final Helper helper = new Helper();
    private EditText editTextRelasi, editTextKapal, editTextAlamatKapal, editTextTanggal, editTexttglPengajuan, editTextKuota, EditTextUserIDPass, editTextUnamePass, editTextPasslama, editTextPassnew;
    private String userid, namaRelasi, tanggalPembuatan, namaKapal, tanggalAntri, kuotaBongkar, createdBy, createdDevice, statusBongkar;
    private long detailIDuser, groupidx;
    public String useridx, usernamex, groupNamex, namaKapalx, alamatKapalx, passwordx;

    public RecyclerViewBookingFragment() {
    }


    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        this.context = context;
    }



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

        View view = inflater.inflate(R.layout.booking_recycler_view_fragment, null);

          if (getArguments() != null) {
            userid = getArguments().getString(KeyContent.KEY_USERID);// ============>>>>>>> this tes get from login activity (NULL VALUE)
        }

        return view;
    }

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

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        pDialog = new ProgressDialog(context);
        recyclerView = view.findViewById(R.id.recycler_view_booking);
        swipeRefreshLayout = view.findViewById(R.id.swipe_refresh_booking);
        FloatingActionButton fab = view.findViewById(R.id.fab);

        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                pDialog.setMessage("Loading Form ...");
                pDialog.show();
                entryDialog(0, "", "", "", "", 0);
                pDialog.dismiss();
                Toast.makeText(context,  userid, Toast.LENGTH_SHORT).show(); // ============>>>>>>> this tes get from login activity (NULL VALUE)
            }
        });
        swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                getAllBooking(KeyContent.KEY_GET_ALL);
                swipeRefreshLayout.setRefreshing(false);
            }
        });
        recyclerView.addOnItemTouchListener(new RecyclerTouchListener(context.getApplicationContext(), recyclerView, new RecyclerTouchListener.ClickListener() {

            @Override
            public void onClick(View view, int position) {

                // if (usernamex.toLowerCase().trim().equals(bookingList.get(position).getNamaRelasi().toLowerCase().trim())) {

                entryDialog(bookingList.get(position).getDetailID(),
                        bookingList.get(position).getNamaRelasi(),
                        bookingList.get(position).getNamaKapal(),
                        bookingList.get(position).getTanggalPembuatan(),
                        bookingList.get(position).getTanggalAntri(),
                        bookingList.get(position).getKuotaBongkar());

              /*  } else {

                    helper.iMessagaseBuilder(context, "  !", false);

                }*/

            }

            @Override
            public void onLongClick(View view, int position) {

            }
        }));
        getAllBooking(KeyContent.KEY_GET_ALL);
    }`



From login Activity ` loginbutton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {


                String userid = textViewuserid.getText().toString();
                String passd = textViewPass.getText().toString();

                if (userid.isEmpty()) {

                    textViewuserid.setError("User ID Tidak Boleh Kosong");
                    textViewuserid.requestFocus();
                    return;
                }

                if (passd.isEmpty()) {

                    textViewPass.setError("Password Harus Diisi");
                    textViewPass.requestFocus();
                    return;
                }

                _GetUserLogin(userid, passd, getDev.getDeviceName(), versionName);

                Bundle bundle = new Bundle();
                bundle.putString(KeyContent.KEY_USERID,"WAI");
                RecyclerViewBookingFragment fragment = new RecyclerViewBookingFragment();
                fragment.setArguments(bundle);
                getSupportFragmentManager().beginTransaction().add(android.R.id.content, fragment).commit();

            }
        });`

in MainNavigationDrawer ` private void setupViewPager(ViewPager viewPager) {
        ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
        adapter.addFrag(new RecyclerViewBookingFragment(), "List Antrian"); //=====================================>> calling Fragment
        adapter.addFrag(new GridViewFragment(), "GridView");
        viewPager.setAdapter(adapter);

    }

片段通信使用接口 ,FragmentA可以通過創建內部接口,它定義了呼叫Activity必須實現方法FragmentB通信。 FragmentB依次執行相同的操作,但是其方法可以是在FragmentA將數據傳遞給Activity之后從Activity獲取數據。 下面是一個例子:

public class FragmentA extends Fragment{

    private Listener mListener;

    public interface Listener{
        void setUser(String user);
        void setPassword(String password);
    }

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        listener = (Listener) context;
    }

    public void someMethod(String user, String password){
        mListener.setUser(user);
        mListener.setPassword(password);
    }


}

同樣的情況也適用於FragmentB ,它將從Activity中選擇傳遞的數據。

public class FragmentB extends Fragment{

    private Listener mListener;
    private String user;
    private String password;


    public interface Listener{
        String getUser();
        String getPassword();
    }

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        mListener = (Listener) context;
    }

    public void someMethod(){
        user = mListener.getUser();
        password = mListener.getUser();
        // use the data in some way
    }

}

活動還必須實現這些接口以最終完成通信管道。

public class MainActivity extends Activity implements FragmentA.Listener, FragmentB.Listener{

    private String user;
    private String password;

    public String getUser() {
       return user;
    }

    public void setUser(String user) {
        this.user = user;
    }

    public String getPassword() {
       return password;
    }

    public void setPassword(String password) {
       this.password = password;
   }

   // the rest of the code that creates the fragments


}

我希望這可以幫助你。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM