Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将数据从片段传递到另一个片段。未附加到上下文的片段_Java_Android_Android Fragments_Kotlin_Fragment - Fatal编程技术网

Java 将数据从片段传递到另一个片段。未附加到上下文的片段

Java 将数据从片段传递到另一个片段。未附加到上下文的片段,java,android,android-fragments,kotlin,fragment,Java,Android,Android Fragments,Kotlin,Fragment,我在将数据从一个片段传递到另一个片段时遇到问题 错误: 原因:java.lang.IllegalStateException:Fragment FragmentBayar{5cd96b2}未附加到上下文。 位于android.support.v4.app.Fragment.requireContext(Fragment.java:614) 位于android.support.v4.app.Fragment.getResources(Fragment.java:678) 位于android.sup

我在将数据从一个片段传递到另一个片段时遇到问题

错误:

原因:java.lang.IllegalStateException:Fragment FragmentBayar{5cd96b2}未附加到上下文。 位于android.support.v4.app.Fragment.requireContext(Fragment.java:614) 位于android.support.v4.app.Fragment.getResources(Fragment.java:678) 位于android.support.v4.app.Fragment.getString(Fragment.java:700) 位于com.kensai.appkasir.fragment.FragmentBayar$Companion.newInstance(FragmentBayar.kt:45) 在com.kensai.appkasir.FragmentActivity.onCreate上(FragmentActivity.kt:55) 位于android.app.Activity.performCreate(Activity.java:6303) 位于android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1108) 在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2376)上

这是我的碎片

class FragmentBayar : Fragment(){
// order information
private lateinit var order: Orders

// data of menu before send
private var editList = ArrayList<EditQuantity>()
private lateinit var dataEditAdapter: EditQuantityAdapter

// data of menu after send
private var progressList = ArrayList<ProgressAntar>()
private lateinit var dataProgressAdapter: ProgressAntarAdapter

companion object {
    fun newInstance(order: Orders): FragmentBayar {
        val fragment = FragmentBayar()

        val bundle = Bundle()
        bundle.putParcelable(fragment.getString(R.string.key_pass_order), order)
        fragment.arguments = bundle
        return fragment
    }
}

// update array list of edit menu from clicked menu fragment
fun updateOrderEditList(menu: Menu){
    val editMenu = EditQuantity(menu,1,"")
    editList.add(0,editMenu)
    rec_edit_quantity.adapter.notifyDataSetChanged()
}

// read argumen as order object
private fun readBundle(bundle: Bundle?) {
    if (bundle != null) {
        order = bundle.getParcelable(getString(R.string.key_pass_order))
    }
}

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
    val view = inflater.inflate(R.layout.fragment_bayar, container, false)

    // get order
    readBundle(arguments)

    // change name order in header of view
    view.order_name.text = order.order

    // initial recyclerview edit item
    view.rec_edit_quantity.layoutManager = LinearLayoutManager(activity)
    view.rec_edit_quantity.isNestedScrollingEnabled = false
    view.rec_edit_quantity.hasFixedSize()
    view.rec_edit_quantity.adapter = EditQuantityAdapter(editList){ editPosition: Int -> editItemClicked(editPosition) }
    // initial recyclerview edit item data
    dataEditAdapter = EditQuantityAdapter(editList){ editPosition: Int -> editItemClicked(editPosition) }
    view.rec_edit_quantity.adapter = dataEditAdapter

    // initial recyclerview progress item
    view.rec_progress_antar.layoutManager = LinearLayoutManager(activity)
    view.rec_progress_antar.isNestedScrollingEnabled = false
    view.rec_progress_antar.hasFixedSize()
    view.rec_progress_antar.adapter = ProgressAntarAdapter(progressList)
    // initial recyclerview progress item data
    dataProgressAdapter = ProgressAntarAdapter(progressList)
    view.rec_progress_antar.adapter = dataProgressAdapter

    // setup pesan button
    btn_pesan.setOnClickListener {
        sendOrder()
    }

    // get detail service from server
    getOrderDetailService()

    return view
}

// call to get order detail from web service
private fun getOrderDetailService() {
    //temp
    progressList = getOrderData()
    dataProgressAdapter.updateData(progressList)
}

// send order list to server
private fun sendOrder(){
    val apiService : Service = Client.getClient()!!.create(Service::class.java)
    apiService.sendOrder(editList).enqueue(object : Callback<List<ProgressAntar>> {

        override fun onResponse(call: Call<List<ProgressAntar>>?, response: Response<List<ProgressAntar>>?) {
            if (response != null && response.isSuccessful) {
                val list = response.body()

                if (list == null || list.isEmpty()) {
                    Toast.makeText(activity, "Tidak ada daftar pembayaran", Toast.LENGTH_LONG).show()
                } else{
                    // empty edit list
                    editList = ArrayList()
                    dataEditAdapter.updateData(editList)
                    // refresh progress list
                    progressList = ArrayList(list)
                    dataProgressAdapter.updateData(progressList)
                }

            } else{
                Toast.makeText(activity, "Tidak ada daftar pembayaran", Toast.LENGTH_LONG).show()
            }
        }

        override fun onFailure(call: Call<List<ProgressAntar>>?, t: Throwable?) {
            Log.i("onFailure", t.toString())
            Toast.makeText(context, "Gagal", Toast.LENGTH_LONG).show()
        }
    })
}

// delete menu item before send
private fun editItemClicked(menuItem : Int){
    editList.removeAt(menuItem)
    rec_edit_quantity.adapter.notifyDataSetChanged()
}

// temp function
private fun getOrderData(): ArrayList<ProgressAntar>{
    val list = ArrayList<ProgressAntar>()
    list.add(ProgressAntar("1","Bakso",15000, 4,0,false))
    list.add(ProgressAntar("2","Teh Panas",  15000, 3,0, false))
    list.add(ProgressAntar("3","Mie Aceh",  15000, 5,5, true))
    list.add(ProgressAntar("4","Teh Dingin",  15000, 3,3, true))

    return list
}

override fun onResume() {
    super.onResume()
    getOrderDetailService()
}

}

正如跟踪所述,问题在于:

fun newInstance(order: Orders): FragmentBayar {
    val fragment = FragmentBayar()

    val bundle = Bundle()
    /* here --> */bundle.putParcelable(fragment.getString(R.string.key_pass_order), order)
    fragment.arguments = bundle
    return fragment
}
当调用
fragment.getString(R.string.key\u pass\u order)
时,需要将片段附加到活动以获取上下文。由于您刚刚初始化了片段,因此没有与之关联的上下文

无论如何,在bundle中放置额外项的通常做法是声明常量以写入/读取其属性。一个简单的解释是,您不需要公开它,它们可以是类的作用域的私有

示例:

companion object {
    private const val KEY_PASS_ORDER = "KEY_PASS_ORDER"

    fun newInstance(order: Orders): FragmentBayar {
        val fragment = FragmentBayar()

        val bundle = Bundle()
        bundle.putParcelable(KEY_PASS_ORDER, order)
        fragment.arguments = bundle
        return fragment
    }
}

private fun readBundle(bundle: Bundle?) {
    if (bundle != null) {
        order = bundle.getParcelable(KEY_PASS_ORDER)
    }
}

我以前遇到过这个问题,并从Android开发者网站上解决了这个问题
构建一个接口非常重要,这样片段就可以通过它们的活动在彼此之间进行通信

companion object {
    private const val KEY_PASS_ORDER = "KEY_PASS_ORDER"

    fun newInstance(order: Orders): FragmentBayar {
        val fragment = FragmentBayar()

        val bundle = Bundle()
        bundle.putParcelable(KEY_PASS_ORDER, order)
        fragment.arguments = bundle
        return fragment
    }
}

private fun readBundle(bundle: Bundle?) {
    if (bundle != null) {
        order = bundle.getParcelable(KEY_PASS_ORDER)
    }
}
    //------------------pass data one fragment to another fragment ------------
    First fragment

    import android.content.Context;
    import android.os.Bundle;
    import android.support.annotation.Nullable;
    import android.support.v4.app.Fragment;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.Button;
    import android.widget.EditText;

    public class FragmentOne extends Fragment {

        SendMessage SM;

        @Nullable
        @Override
        public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
            View rootView = inflater.inflate(
                    R.layout.fragment_one, container, false);
            return rootView;


        }

        @Override
        public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
            super.onViewCreated(view, savedInstanceState);

            Button btnPassData = (Button) view.findViewById(R.id.btnPassData);
            final EditText inData = (EditText) view.findViewById(R.id.inMessage);
            btnPassData.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    SM.sendData(inData.getText().toString().trim());
                }
            });

        }

        interface SendMessage {
            void sendData(String message);
        }

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

            try {
                SM = (SendMessage) getActivity();
            } catch (ClassCastException e) {
                throw new ClassCastException("Error in retrieving data. Please try again");
            }
        }
    }

    //------------------second fragment----------------------------



    import android.os.Bundle;
    import android.support.annotation.Nullable;
    import android.support.v4.app.Fragment;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.TextView;

    public class FragmentTwo extends Fragment {

        TextView txtData;

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

        @Override
        public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
            super.onViewCreated(view, savedInstanceState);

            txtData = (TextView)view.findViewById(R.id.txtData);
        }

        protected void displayReceivedData(String message


)
        {
            txtData.setText("Data received: "+message);
        }
    }