Saya cukup baru menggunakan Fragmen.
Saya hanya mencoba membuat aplikasi sampel sederhana yang menggunakan Fragmen. Skenario saya adalah, saya memiliki dua aktivitas dengan satu fragmen di dalam setiap aktivitas. Fragmen pertama memiliki teks edit dan tombol. Fragmen kedua memiliki textview. Ketika saya memasukkan nama di edittext dan mengklik tombolnya, textview di fragmen kedua harus menampilkan nama yang dimasukkan di edittext dari fragmen pertama.
Saya bisa mengirim nilai dari fragmen pertama ke aktivitasnya dan kemudian dari aktivitas itu ke aktivitas kedua. Sekarang bagaimana cara menggunakan nilai ini di dalam fragmen kedua.
Berikut adalah kode Java :::
package com.example.fragmentexample;
import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentManager;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class Fragment_1 extends Fragment{
OnFragmentChangedListener mCallback;
// Container Activity must implement this interface
public interface OnFragmentChangedListener {
public void onButtonClicked(String name);
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
// This makes sure that the container activity has implemented
// the callback interface. If not, it throws an exception
try {
mCallback = (OnFragmentChangedListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString()
+ " must implement OnHeadlineSelectedListener");
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// TODO Auto-generated method stub
View view = inflater.inflate(R.layout.fragment_fragment_1, container, false);
final EditText edtxtPersonName_Fragment = (EditText) view.findViewById(R.id.edtxtPersonName);
Button btnSayHi_Fragment = (Button) view.findViewById(R.id.btnSayHi);
btnSayHi_Fragment.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
String name = edtxtPersonName_Fragment.getText().toString();
FragmentManager fm = getFragmentManager();
Fragment_2 f2 = (Fragment_2) fm.findFragmentById(R.id.fragment_content_2);
Activity activity = getActivity();
if(activity != null)
{
Toast.makeText(activity, "Say&ing Hi in Progress...", Toast.LENGTH_LONG).show();
}
if(f2 != null && f2.isInLayout())
{
f2.setName(name);
}
else
{
mCallback.onButtonClicked(name);
}
}
});
return view;
}
}
MainActivity.Java
package com.example.fragmentexample;
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.Choreographer.FrameCallback;
import android.view.Menu;
public class MainActivity extends Activity implements Fragment_1.OnFragmentChangedListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
@Override
public void onButtonClicked(String name) {
// TODO Auto-generated method stub
Intent i = new Intent(this, SecondActivity.class);
i.putExtra("", name);
startActivity(i);
}
}
SecondActivity.Java
package com.example.fragmentexample;
import android.app.Activity;
import android.os.Bundle;
public class SecondActivity extends Activity{
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
Bundle b = getIntent().getExtras();
Fragment_2 f2 = new Fragment_2();
f2.setArguments(b);
}
}
Fragment_2.Java
package com.example.fragmentexample;
import android.app.Activity;
import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
public class Fragment_2 extends Fragment{
View view;
TextView txtName;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// TODO Auto-generated method stub
view = inflater.inflate(R.layout.fragment_fragment_2, container, false);
// Exception at this line
String name = getArguments().getString("message");
txtName = (TextView) view.findViewById(R.id.txtViewResult);
txtName.setText(name);
return view;
}
@Override
public void onAttach(Activity activity) {
// TODO Auto-generated method stub
super.onAttach(activity);
}
public void setName(String name)
{
txtName.setText("Hi " + name);
}
}
Saya mendapatkan pengecualian berikut :::
04-16 18:10:24.573: E/AndroidRuntime(713): FATAL EXCEPTION: main
04-16 18:10:24.573: E/AndroidRuntime(713): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.fragmentexample/com.example.fragmentexample.SecondActivity}: android.view.InflateException: Binary XML file line #8: Error inflating class fragment
04-16 18:10:24.573: E/AndroidRuntime(713): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1815)
04-16 18:10:24.573: E/AndroidRuntime(713): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1831)
04-16 18:10:24.573: E/AndroidRuntime(713): at android.app.ActivityThread.access$500(ActivityThread.java:122)
04-16 18:10:24.573: E/AndroidRuntime(713): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1024)
04-16 18:10:24.573: E/AndroidRuntime(713): at android.os.Handler.dispatchMessage(Handler.java:99)
04-16 18:10:24.573: E/AndroidRuntime(713): at android.os.Looper.loop(Looper.java:132)
04-16 18:10:24.573: E/AndroidRuntime(713): at android.app.ActivityThread.main(ActivityThread.java:4123)
04-16 18:10:24.573: E/AndroidRuntime(713): at java.lang.reflect.Method.invokeNative(Native Method)
04-16 18:10:24.573: E/AndroidRuntime(713): at java.lang.reflect.Method.invoke(Method.java:491)
04-16 18:10:24.573: E/AndroidRuntime(713): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
04-16 18:10:24.573: E/AndroidRuntime(713): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
04-16 18:10:24.573: E/AndroidRuntime(713): at dalvik.system.NativeStart.main(Native Method)
04-16 18:10:24.573: E/AndroidRuntime(713): Caused by: android.view.InflateException: Binary XML file line #8: Error inflating class fragment
04-16 18:10:24.573: E/AndroidRuntime(713): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:688)
04-16 18:10:24.573: E/AndroidRuntime(713): at android.view.LayoutInflater.rInflate(LayoutInflater.java:724)
04-16 18:10:24.573: E/AndroidRuntime(713): at android.view.LayoutInflater.inflate(LayoutInflater.java:479)
04-16 18:10:24.573: E/AndroidRuntime(713): at android.view.LayoutInflater.inflate(LayoutInflater.java:391)
04-16 18:10:24.573: E/AndroidRuntime(713): at android.view.LayoutInflater.inflate(LayoutInflater.java:347)
04-16 18:10:24.573: E/AndroidRuntime(713): at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:223)
04-16 18:10:24.573: E/AndroidRuntime(713): at android.app.Activity.setContentView(Activity.java:1786)
04-16 18:10:24.573: E/AndroidRuntime(713): at com.example.fragmentexample.SecondActivity.onCreate(SecondActivity.java:13)
04-16 18:10:24.573: E/AndroidRuntime(713): at android.app.Activity.performCreate(Activity.java:4397)
04-16 18:10:24.573: E/AndroidRuntime(713): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1048)
04-16 18:10:24.573: E/AndroidRuntime(713): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1779)
04-16 18:10:24.573: E/AndroidRuntime(713): ... 11 more
04-16 18:10:24.573: E/AndroidRuntime(713): Caused by: java.lang.NullPointerException
04-16 18:10:24.573: E/AndroidRuntime(713): at com.example.fragmentexample.Fragment_2.onCreateView(Fragment_2.java:24)
04-16 18:10:24.573: E/AndroidRuntime(713): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:754)
04-16 18:10:24.573: E/AndroidRuntime(713): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:956)
04-16 18:10:24.573: E/AndroidRuntime(713): at android.app.FragmentManagerImpl.addFragment(FragmentManager.java:1035)
04-16 18:10:24.573: E/AndroidRuntime(713): at android.app.Activity.onCreateView(Activity.java:4177)
04-16 18:10:24.573: E/AndroidRuntime(713): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:664)
04-16 18:10:24.573: E/AndroidRuntime(713): ... 21 more
Bagaimana cara mendapatkan nilai dari bundel di SecondActivity.java ke Fragment_2.Java?
sumber
Jawaban:
langkah 1. untuk mengirim data dari fragmen ke aktivitas
langkah 2. untuk menerima data ini dalam Aktivitas:
langkah 3 . untuk mengirim data dari aktivitas ke aktivitas lain ikuti pendekatan normal
langkah 4 untuk menerima data ini dalam aktivitas
Langkah 5. Dari Aktivitas Anda bisa mengirim data ke Fragment dengan maksud sebagai:
dan untuk menerima dalam fragmen dalam metode onCreateView Fragment:
sumber
bundle.putString("message", "From Activity");
Sebagaimana dicatat di situs pengembang
komunikasi antar fragmen harus dilakukan melalui Aktivitas terkait.
Mari kita memiliki komponen berikut:
Implementasi FragmentA adalah:
Implementasi MainActivity adalah:
Implementasi FragmentB adalah:
Saya harap ini akan membantu ..
sumber
// Dalam Fragment_1.java
// Dalam Fragment_2.java
Semoga ini membantu Anda.
sumber
putString
(atauputInt
) adalah jawabannya!Dari situs web Pengembang :
Anda dapat berkomunikasi di antara fragmen dengan bantuan Activity-nya. Anda dapat berkomunikasi di antara aktivitas dan fragmen menggunakan pendekatan ini .
Silakan periksa juga tautan ini .
sumber
Pertama semua jawaban benar, Anda dapat mengirimkan data kecuali objek kustom dengan menggunakan
Intent
. Jika Anda ingin meneruskan objek kustom, Anda harus mengimplementasikanSerialazable
atauParcelable
ke kelas objek kustom Anda. Saya pikir itu terlalu rumit ...Jadi jika proyek Anda sederhana, coba gunakan
DataCache
. Itu memberikan cara yang sangat sederhana untuk meneruskan data. Ref: proyek Github CachePot1- Setel ini ke View atau Activity atau Fragment yang akan mengirim data
2- Dapatkan data di mana saja seperti di bawah ini
sumber
Solusi terbaru untuk meneruskan data antar fragmen dapat diimplementasikan dengan menggunakan komponen arsitektur android seperti ViewModel dan LiveData. Dengan solusi ini, Anda tidak perlu menentukan antarmuka untuk komunikasi dan bisa mendapatkan keuntungan menggunakan viewmodel seperti kelangsungan data karena perubahan konfigurasi.
Dalam solusi ini, fragmen yang terlibat dalam komunikasi berbagi objek viewmodel yang sama yang terkait dengan daur hidup aktivitasnya. Objek model tampilan berisi objek Liveata. Satu fragmen menyetel data untuk diteruskan pada objek Liveata dan fragmen kedua, pengamat, liveata, mengubah dan menerima data.
Berikut adalah contoh lengkapnya http://www.zoftino.com/passing-data-between-android-fragments-using-viewmodel
sumber
Meneruskan argumen antar fragmen. Ini agak terlambat untuk menjawab pertanyaan ini tetapi ini bisa membantu seseorang!
Fragment_1.java
Kemudian di Anda,
Fragment_2.java
Anda bisa mendapatkan paramaters secara normal dalamonActivityCreated
misalnya Andasumber
Saya pikir cara yang baik untuk mengatasi masalah ini adalah dengan menggunakan antarmuka khusus.
Katakanlah Anda memiliki dua fragmen (A dan B) yang berada di dalam aktivitas yang sama dan Anda ingin mengirim data dari A ke B.
Antarmuka:
Aktivitas:
Fragmen A:
Fragmen B:
sumber
Berkomunikasi antar fragmen cukup rumit (menurut saya konsep pendengar agak menantang untuk diterapkan).
Biasanya menggunakan 'Bus Acara "untuk mengabstraksi komunikasi ini. Ini adalah perpustakaan pihak ketiga yang menangani komunikasi ini untuk Anda.
'Otto' adalah salah satu yang sering digunakan untuk melakukan ini, dan mungkin layak untuk dilihat: http://square.github.io/otto/
sumber
Meneruskan data dari Fragmen ke Fragmen lain
Dari Fragmen pertama
Pada Fragmen Kedua
sumber
Implementasi sederhana ini membantu meneruskan data antar fragmen dengan cara yang sederhana. Pikirkan Anda ingin meneruskan data dari 'Frgment1' ke 'Fragment2'
Di Fragment1 (Setel data untuk dikirim)
Dalam metode onCreateView Fragment2 (Dapatkan parameter)
sumber
Cara Kotlin
Gunakan yang
SharedViewModel
diusulkan di dokumentasi ViewModel resmiPertama-tama terapkan fragment-ktx untuk membuat instance viewmodel Anda dengan lebih mudah
Kemudian, Anda hanya perlu memasukkan ke dalam viewmodel data yang akan Anda bagikan dengan fragmen lain
Kemudian, untuk menyelesaikannya, cukup buat instance viewModel Anda di setiap fragmen, dan setel nilai dari
selected
fragmen yang ingin Anda setel datanyaFragmen A
Dan kemudian, dengarkan saja nilai ini di tujuan Fragmen Anda
Fragmen B
Anda juga bisa melakukannya dengan cara yang berlawanan
sumber
Solusi Kerja 100%: (jika membantu Anda maka jangan lupa untuk menekan upvote)
Di Fragmen Pertama Anda, masukkan kode ini:
Di Second Fragment, buat metode seperti di bawah ini:
lalu tentukan variabel di tingkat kelas:
lalu buat metode lain di fragmen kedua untuk menyetel nilai:
sumber
Anda dapat mencapai tujuan Anda dengan ViewModel dan Live Data yang diselesaikan oleh Arnav Rao . Sekarang saya beri contoh agar lebih rapi.
Pertama, diasumsikan
ViewModel
bernamaSharedViewModel.java
.Kemudian fragmen sumber adalah
MasterFragment.java
dari mana kita ingin mengirim data.Dan akhirnya bagian tujuan adalah
DetailFragment.java
ke tempat kami ingin menerima data.sumber
Oke setelah begitu banyak penggalian di sini saya menemukan solusi sederhana, sebenarnya Anda tidak boleh meneruskan data dari fragmen ke fragmen itu selalu ide yang buruk, Anda bisa meneruskan data dari fragmen A ke aktivitas dan mendapatkan data dari aktivitas di fragmen B.
// di Aktivitas Utama
// sekarang di FragmentB
sumber
Saya telah membuat sesuatu yang sangat mudah untuk pemula seperti saya .. saya membuat tampilan teks di activity_main.xml saya dan meletakkan
lalu saya mendapatkan textview ini dari fragmen pertama
dan kemudian di fragmen kedua saya mendapatkan nilainya
semoga membantu!
sumber