آموزش ارسال داده از اکتیویتی به فرگمنت در اندروید
سلام دوستان در این سری از آموزش برنامه نویسی اندروید به آموزش ارسال داده از اکتیویتی به فرگمنت در اندروید می پردازیم فرگمنت ها و اکتیویتی ها مهمترین بخش ها در برنامه نویسی هستند توصیه می کنم این مبحث را به خوبی یاد بگیرید در این آموزش خواهید دید به سادگی داده ها را از اکتیویتی به فرگمنت ارسال خواهیم کرد با ما همراه باشید.
باید سه کار انجام شود .
اولین کار استفاده از bundle برای قرار دادن داده
Bundle data = new Bundle();
data.putString("key_value", "Programchi.ir");
دومین کار SetArguments برای پاس دادن دیتا
fragmentName.setArguments(data);
در بالا fragmentName نام فرگمنتی است که شما ساخته اید.
سومین کار دریافت یا GetArguments
String getArgument = getArguments().getString("key_value");
شاید کمی گیج شده باشید در ادامه به یک آموزش کاربردی خواهیم دید.
ما یک فایل به نام activity_main.xml داریم که کد های زیر را در آن قرار دهید.
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:id="@+id/setDefaultFragment"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Default Fragment" />
<Button
android:id="@+id/setArgumentFragment"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Argument Fragment" />
</LinearLayout>
<!-- Frame Layout for placing Fragments -->
<FrameLayout
android:id="@+id/fragmentContainer"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
</FrameLayout>
</LinearLayout>
دو دکمه برای قرار دادن و به دست آوردن داده قرار دارد و یک Frame Layout داریم که برای نمایش fragment مون داریم.
یک فایل به نام fragmentlayout.xml در layout خود درست کرده و کد های زیر را در آن قرار دهید.
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#ff00"
android:gravity="center"
android:orientation="vertical">
<TextView
android:id="@+id/fragmentText"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:text="Default Text"
android:textColor="#ffffff"
android:textSize="20sp" />
</LinearLayout>
حالا باید کد های مربوط به فرگمنت را قرار دهید پس یک فایل به نام DefaultFragment.java ایجاد کرده و کدهای زیر را در آن قرار دهید.
package com.fragmentsetargument_demo;
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;
/**
* Created by Jefferson on 07/10/17.
*/
public class DefaultFragment extends Fragment {
//Simple Fragment
public DefaultFragment() {
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragmentlayout, container, false);
}
}
یک فایل دیگر به نام ArgumentFragment.java ایجاد کرده و کد های زیر را در آن قرار دهید.
package ir.programchi;
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;
/**
* Created by Jefferson on 07/10/17.
*/
public class ArgumentFragment extends Fragment {
public ArgumentFragment() {
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragmentlayout, container, false);//Inflate Layout
TextView text = (TextView) view.findViewById(R.id.fragmentText);//Find textview Id
String getArgument = getArguments().getString("data");
text.setText(getArgument);//set string over textview
return view;//return view
}
}
و در آخر کد مربوط به MainActivity.java همانند زیر می شود.
package ir.programchi;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private static Button defaultFragment, argumentFragment;
private static FragmentManager fragmentManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
fragmentManager = getSupportFragmentManager();//Get Fragment Manager
//Find Ids
defaultFragment = (Button) findViewById(R.id.setDefaultFragment);
argumentFragment = (Button) findViewById(R.id.setArgumentFragment);
defaultFragment.setOnClickListener(this);
argumentFragment.setOnClickListener(this);
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.setDefaultFragment:
fragmentManager.beginTransaction().replace(R.id.fragmentContainer, new DefaultFragment()).commit();
break;
case R.id.setArgumentFragment:
Fragment argumentFragment = new ArgumentFragment();//Get Fragment Instance
Bundle data = new Bundle();//Use bundle to pass data
data.putString("data", "This is Argument Fragment");//put string, int, etc in bundle with a key value
argumentFragment.setArguments(data);//Finally set argument bundle to fragment
fragmentManager.beginTransaction().replace(R.id.fragmentContainer, argumentFragment).commit();
break;
}
}
}
این آموزش هم به پایان رسید.
موفق و موید باشید.
آموزش برنامه نویسی اندروید |
سلام، ممنون از مطالب آموزشی خوبتون.
یه بار دیگه سوالم رو اینجا مطرح میکنم 🙂
تو این آموزش ما دیتا رو از اکتیویتی میفرستیم به فرگمنتی که تو خود اکتیویتی داریم لود میکنیم….
اما من میخوام مثلا دیتا رو از اکتیویتی 1 بفرستم به فرگمنتی در اکتیویتی2…آیا باید ابتدا دیتا رو از اکتیویتی 1 بفرستم به اکتیویتی 2 و بعد از اکتیویتی 2 بفرستم به فرگمنت؟؟؟ یا اینکه مستقیم میشه دیتا رو از اکتیویتی 1 فرستاد به فرگمنتی در اکتیویتی 2…
ممنون میشم راهنمایی کنید 🙂
سلام اگر کمی به آموزش دقت می کردید می توانستید کد زیر را از آن بیرون بکشید برای انتقال مثل زیر عمل کنید (ساده ترین مثالی که میشه مثال زد)
کد اکتیویتی اول
Bundle bundle = new Bundle(); bundle.putString("edttext", "From Activity"); Fragmentclass fragobj = new Fragmentclass(); fragobj.setArguments(bundle);گد فرگمنت که دیتا گرفته می شود.
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { String strtext = getArguments().getString("edttext"); return inflater.inflate(R.layout.fragment, container, false); }موفق باشید.
سلام، ممنون از پاسختون.
با اینکه این شیوه رو امتحان کرده بودم اما کار نکرد برام…. با استفاده از اینتنت اما جواب گرفتم.
در اکتیویتی اول :
Intent intent = new Intent(getActivity(), SecondActivity.class);
intent.putExtra(“message”, data);
startActivity(intent);
و در فرگمنت اکتیویتی دوم :
SecondActivity activity = (SecondActivity) getActivity();
String data= activity.getIntent().getExtras().getString(“message”);
سلام وقتتون بخیر.
من یک اکتیویتی دارم که داخلش یک tabLayut با دو فرگمنت هست . یک سری اطلاعات رو قرار از این اکتویتی به یکی از این فرگمنت ها انتقال بدم و از همین روش bundle استفاده میکنم ولی موقع دریافت اطلاعات در فرگمنت داده ها رو دریافت نمیکنه و این اررور رو میده
java.lang.NullPointerException: Attempt to invoke virtual method ‘java.lang.String
android.os.Bundle.getString(java.lang.String)’ on a null object reference
چه جوری باید این مشکل رفع کنم
https://stackoverflow.com/a/46828366
این روش هم با bundle گفته بود رو انجام دادم ولی بازهم همون اررور رو میده