Android에서 활동에서 단편으로 데이터 전송
수업이 두 개 있습니다.입니다가 입니다.EditText
는 활동 중에 서브클래스가 있습니다.doInBackground
어떤 결과를 얻었는데 변수에 저장합니다.이 변수를 하위 클래스 "my activity"에서 이 조각으로 어떻게 보낼 수 있습니까?
Activity에서 다음과 같은 의도로 데이터를 보냅니다.
Bundle bundle = new Bundle();
bundle.putString("edttext", "From Activity");
// set Fragmentclass Arguments
Fragmentclass fragobj = new Fragmentclass();
fragobj.setArguments(bundle);
그리고 Fragment on CreateView 메서드에서:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
String strtext = getArguments().getString("edttext");
return inflater.inflate(R.layout.fragment, container, false);
}
또한 프래그먼트에서 활동 데이터에 액세스할 수 있습니다.
활동:
public class MyActivity extends Activity {
private String myString = "hello";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my);
...
}
public String getMyData() {
return myString;
}
}
조각:
public class MyFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
MyActivity activity = (MyActivity) getActivity();
String myDataFromActivity = activity.getMyData();
return view;
}
}
저는 here @ stackoverflow.com 에 대한 많은 답변을 찾았지만, 이것은 확실히 다음과 같은 답변입니다.
"안드로이드에서 액티비티에서 프래그먼트로 데이터 전송"
활동:
Bundle bundle = new Bundle();
String myMessage = "Stackoverflow is cool!";
bundle.putString("message", myMessage );
FragmentClass fragInfo = new FragmentClass();
fragInfo.setArguments(bundle);
transaction.replace(R.id.fragment_single, fragInfo);
transaction.commit();
조각:
프래그먼트의 값을 읽는 중
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
Bundle bundle = this.getArguments();
String myValue = bundle.getString("message");
...
...
...
}
아니면 그냥
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
String myValue = this.getArguments().getString("message");
...
...
...
}
이 답변은 너무 늦었을 수도 있습니다.하지만 미래의 독자들에게 유용할 것입니다.
몇 가지 기준이 있습니다.저는 intent.에서 파일을 선택할 수 있도록 코딩을 했고, 추가 프로세스를 위해 특정 조각에 전달할 파일을 선택했습니다.파일 피킹 기능을 가진 프래그먼트가 많습니다.그때는 매번 상태를 체크하고 fragment를 받아서 값을 전달하는 것이 상당히 역겹기 때문에 interface를 이용해서 값을 전달하기로 했습니다.
1단계: 주 활동의 인터페이스를 만듭니다.
public interface SelectedBundle {
void onBundleSelect(Bundle bundle);
}
2단계: 동일한 활동에 대해 선택한 번들 참조 만들기
SelectedBundle selectedBundle;
3단계: 동일한 활동에서 메소드 생성
public void setOnBundleSelected(SelectedBundle selectedBundle) {
this.selectedBundle = selectedBundle;
}
4단계: 모두 fragment need filepicker 기능인 SelectedBundle 참조를 초기화해야 합니다.당신은 이 코드를 당신의 조각 위에 올려놓습니다.onCreateView(..)
((MainActivity)getActivity()).setOnBundleSelected(new MainActivity.SelectedBundle() {
@Override
public void onBundleSelect(Bundle bundle) {
updateList(bundle);
}
});
5단계: 저의 경우, HomeActivity에서 fragment로 URI 이미지를 전달해야 합니다.그래서 ActivityResult 메서드에서 이 기능을 사용했습니다.
ActivityResult from MainActivity에서 인터페이스를 사용하여 fragments에 값을 전달합니다.
참고: 사용자의 경우는 다를 수 있습니다.홈 액티비티에서 어디서든 호출할 수 있습니다.
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
selectedBundle.onBundleSelect(bundle);
}
그게 다예요.프래그먼트 클래스에 필요한 모든 프래그먼트를 구현합니다.당신은 훌륭합니다.당신은 끝냈어요.와...
이때 프래그먼트 인스턴스를 호출하고 데이터를 전송하는 것이 가장 좋고 편리한 방법입니다.기본적으로 모든 조각에는 인스턴스 메서드가 있습니다.
예: fragment name이 MyFragment인 경우
그래서 당신은 당신의 프래그먼트를 다음과 같이 부를 것입니다.
getSupportFragmentManager().beginTransaction().add(R.id.container, MyFragment.newInstance("data1","data2"),"MyFragment").commit();
*R.id .container는 프레임 레이아웃을 지원합니다.
따라서 MyFragment.newInstance("data1", data2")에서 데이터를 fragment로 보낼 수 있으며, fragment에서는 MyFragment newInstance(String param1, String param2)에서 데이터를 얻을 수 있습니다.
public static MyFragment newInstance(String param1, String param2) {
MyFragment fragment = new MyFragment();
Bundle args = new Bundle();
args.putString(ARG_PARAM1, param1);
args.putString(ARG_PARAM2, param2);
fragment.setArguments(args);
return fragment;
}
그러면 create method of fragment에서 데이터를 얻을 수 있습니다.
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
mParam1 = getArguments().getString(ARG_PARAM1);
mParam2 = getArguments().getString(ARG_PARAM2);
}
}
그래서 mParam1은 data1을 갖고 mParam2는 data2를 갖습니다.
이제 이 mParam1과 mParam2를 프래그먼트에 사용할 수 있습니다.
프래그먼트(Fragments)를 사용하는 기본 아이디어는 안드로이드 애플리케이션에서 재사용 가능한 자가 유지 UI 구성 요소를 만드는 것입니다.이러한 프래그먼트는 활동에 포함되어 있으며 A -> F 및 F-A에서 커뮤니케이션 경로를 생성하는 일반적인(최상의) 방법이 있습니다. 활동을 통해 F-F 사이에 커뮤니케이션을 수행하는 것이 필수입니다. 프래그먼트만 분리되어 자체적으로 유지되기 때문입니다.
따라서 A -> F로부터 데이터를 전달하는 것은 ρяσѕρєя K가 설명한 것과 같을 것입니다.이 답변 외에도 활동 내부에 프래그먼트를 생성한 후 프래그먼트의 프래그먼트 호출 메서드에 데이터를 전달할 수도 있습니다.
예를 들어,
ArticleFragment articleFrag = (ArticleFragment)
getSupportFragmentManager().findFragmentById(R.id.article_fragment);
articleFrag.updateArticleView(position);
저는 초보자들을 위해 여기서 가장 많은 지지를 받은 두 답변의 차이가 단편의 다른 사용에 의해 주어진다는 것을 덧붙이고 싶습니다.
전달할 데이터가 있는 Java 클래스 내의 fragment를 사용하는 경우 첫 번째 답변을 데이터 전달에 적용할 수 있습니다.
Bundle bundle = new Bundle();
bundle.putString("edttext", "From Activity");
Fragmentclass fragobj = new Fragmentclass();
fragobj.setArguments(bundle);
예를 들어 Android Studio에서 제공하는 기본 코드를 탭 조각에 사용하는 경우 이 코드는 작동하지 않습니다.
기본 자리 표시자 조각을 FragmentClasses로 바꾸고, FragmentPagerAdapter를 새 상황으로 수정하더라도 getItem()에 대한 스위치와 getPageTitle()에 대한 다른 스위치를 추가해도 작동하지 않습니다(여기에 표시됨).
경고: 위에 언급된 클립에 코드 오류가 있습니다. 여기서는 이 오류에 대해 나중에 설명하지만 탭으로 표시된 조각에 대해 기본 코드에서 편집 가능한 코드로 전환하는 방법을 확인하는 데 유용합니다.)만약 당신이 그 클립의 자바 클래스와 xml 파일(초보 시나리오에 의한 탭 프래그먼트의 첫 번째 사용에 대한 대표적인)을 고려한다면, 제 나머지 대답은 훨씬 더 일리가 있습니다.
이 페이지에서 가장 많이 선택된 답변이 작동하지 않는 주된 이유는 탭 프래그먼트의 기본 코드에서 프래그먼트가 다른 자바 클래스에서 사용되기 때문입니다.조각 호출기 어댑터!
따라서 데이터를 전송하기 위해 Mother Activity에 번들을 생성하고 2번 답변을 사용하여 FragmentPagerAdapter에 전달할 수 있습니다.
다만 그것은 또 잘못된 것입니다. (아마도 그렇게 할 수 있겠지만, 그것은 정말로 필요하지 않은 문제일 뿐입니다.)
정확하고 쉬운 방법은 2번 답을 사용하여 문제의 조각에 직접 데이터를 전달하는 것이라고 생각합니다.네, 액티비티와 프래그먼트 사이에는 긴밀한 결합이 이루어지겠지만, 탭으로 표시된 프래그먼트의 경우에는 그런 것이 예상됩니다.MotherActivity java 클래스 내부에 탭 프래그먼트를 생성할 것을 권합니다(MotherActivity java 클래스 외부에서는 절대 사용되지 않으므로 하위 클래스로). 이는 간단합니다. 다음과 같이 필요한 만큼 MotherActivity java 클래스 내부에 프래그먼트를 추가하십시오.
public static class Tab1 extends Fragment {
public Tab1() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.your_layout_name_for_fragment_1, container, false);
return rootView;
}
}.
따라서 MotherActivity에서 해당 Fragment로 데이터를 전달하려면 onCreate of your Mother 활동 위에 개인 Strings/Bundles를 생성해야 합니다. 이 활동은 프래그먼트로 전달할 데이터로 채우고 onCreate 이후에 생성된 메서드(여기서 getMyData())를 통해 전달할 수 있습니다.
public class MotherActivity extends Activity {
private String out;
private Bundle results;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_mother_activity);
// for example get a value from the previous activity
Intent intent = getIntent();
out = intent.getExtras().getString("Key");
}
public Bundle getMyData() {
Bundle hm = new Bundle();
hm.putString("val1",out);
return hm;
}
}
그리고 fragment 클래스에서는 getMyData:
public static class Tab1 extends Fragment {
/**
* The fragment argument representing the section number for this
* fragment.
*/
public Tab1() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.your_layout_name_for_fragment_1, container, false);
TextView output = (TextView)rootView.findViewById(R.id.your_id_for_a_text_view_within_the_layout);
MotherActivity activity = (MotherActivity)getActivity();
Bundle results = activity.getMyData();
String value1 = results.getString("val1");
output.setText(value1);
return rootView;
}
}
데이터베이스 쿼리가 있는 경우 MotherActivity(및 위와 같이 번들 내의 키에 첨부된 Strings/Integers로 결과를 전달합니다)에서 수행할 것을 조언합니다. 탭 조각 내부에서와 같이 구문이 더 복잡해집니다(예를 들어 getActivity()가 되고 getIntent는 getActivity(.getIntent)가 됩니다).하지만 원하는 대로 할 수 있는 선택권도 있습니다.
초보자들을 위한 저의 조언은 작은 걸음에 집중하라는 것입니다.먼저, 데이터를 전달하지 않고 아주 간단한 탭 작업을 열 의도를 파악합니다.작동합니까?원하는 탭이 열리나요?그렇지 않다면, 왜죠?
여기서부터 시작하여 이 클립에 제시된 것과 같은 솔루션을 적용하여 무엇이 누락되었는지 확인합니다.해당 클립의 경우 mainactivity.xml이 표시되지 않습니다.그것은 틀림없이 당신을 혼란스럽게 할 것입니다.그러나 주의를 기울인다면 예를 들어 xml 조각 파일에서 컨텍스트(tools:context)가 잘못되었음을 알 수 있습니다.각 프래그먼트 XML은 올바른 프래그먼트 클래스(또는 구분자 $를 사용하는 서브클래스)를 가리켜야 합니다.
또한 메인 액티비티 java 클래스에서 tabLayout을 추가해야 합니다.setupWithViewPager(mViewPager) - TabLayout 탭Layout =(TabLayout) findViewById(R.id .tabs) 행 바로 뒤에 있습니다. 이 행이 없으면 실제로 뷰는 프래그먼트의 XML 파일에 연결되지 않지만 기본 활동의 XML 파일만 표시됩니다.
주 활동 자바 클래스의 행 외에 주 활동 XML 파일에서는 탭을 상황에 맞게 변경해야 합니다(예: TabItems 추가 또는 제거).기본 활동 XML에 탭이 없을 경우, 애당초 활동을 만들 때 올바른 활동 유형을 선택하지 않았을 수 있습니다(새 활동 - 탭이 있는 활동).
마지막 3단락에서 영상에 대해 이야기하니 참고 부탁드립니다!그래서 제가 main activity XML이라고 하면 동영상의 main activity XML이고, 당신의 상황에서는 mother activity XML 파일입니다.
(구체적인 서브클래스 of) fragment에 대한 참조를 비동기 작업에 전달하면 fragment에 직접 액세스할 수 있습니다.
프래그먼트 참조를 비동기 작업으로 전달하는 몇 가지 방법:
- ()
class FooTask extends AsyncTask
그런 합니다.) 합니다합니다. - 비동기 작업이 내부 클래스인 경우 비동기 작업이 정의된 범위 또는 외부 클래스의 필드에 final Fragment 변수를 선언합니다.내부 클래스에서 액세스 할 수 있습니다.
:Activity
다음과 같이 번들과 함께 데이터를 보냅니다.
Bundle bundle = new Bundle();
bundle.putString("data", "Data you want to send");
// Your fragment
MyFragment obj = new MyFragment();
obj.setArguments(bundle);
그리고 인.Fragment
onCreateView다.
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
String data = getArguments().getString("data");// data which sent from activity
return inflater.inflate(R.layout.myfragment, container, false);
}
활동에서 인텐트(Intent)를 받을 수 있으며 작업 중인 조각에 정보를 전달해야 하는 경우도 있습니다.
은 프래그먼트를 작동,setArguments()
별로 쓸모가 없습니다.
전달된 정보가 UI와 상호 작용하는 경우 또 다른 문제가 발생합니다.다 같은 수 .myfragment.passData()
안드로이드는 보기를 만든 스레드만이 상호 작용할 수 있음을 빠르게 알려주기 때문입니다.
그래서 저의 제안은 수신기를 사용하는 것입니다.이렇게 하면 작업을 포함한 모든 장소에서 데이터를 보낼 수 있지만, 작업은 조각의 컨텍스트 내에서 수행됩니다.
에 있는 onCreate()
:
protected DataReceiver dataReceiver;
public static final String REC_DATA = "REC_DATA";
@Override
public void onCreate(Bundle savedInstanceState) {
data Receiver = new DataReceiver();
intentFilter = new IntentFilter(REC_DATA);
getActivity().registerReceiver(dataReceiver, intentFilter);
}
private class DataReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
int data= intent.getIntExtra("data", -1);
// Do anything including interact with your UI
}
}
활동 중:
// somewhere
Intent retIntent = new Intent(RE_DATA);
retIntent.putExtra("data", myData);
sendBroadcast(retIntent);
아주 오래된 게시물이지만, 저에게 도움이 될만한 작은 설명을 감히 덧붙입니다.
기술적으로는 모든 유형의 구성원을 활동의 조각에 직접 설정할 수 있습니다.
그래서 번들은 왜?
이유는 간단합니다.이 통일된 때문입니다.다. 번들은 균일한 처리 방법을 제공하기 때문입니다.
-- /
- -- SaveInstanceState() --기) - SaveInstanceState()다전 outStat을에서 초기/업데이트 합니다.
한 후 앱 시와 ) --원이).
간단한 상황에서 (실험을 좋아하는 경우) 해결책을 만들 수 있지만 번들 접근 방식은 백스택에서 하나의 조각과 천 개의 조각 사이에 차이가 없습니다. 단순하고 단순하게 유지됩니다.
그렇기 때문에 @Elenasys의 대답이 가장 우아하고 보편적인 해결책인 것입니다.
그래서 @Martin이 제시한 대답은 함정이 있습니다.
만약에activity
만들 필요가 있습니다.fragment
을 수행하는 를 가지는 입니다.activity
합니다.fragment
사례.에서fragment
, 메서드를 추가합니다.
public class DemoFragment extends Fragment {
public void doSomething(String param) {
// do something in fragment
}
}
activity
, .fragment
을 사용하여fragment
를 합니다.method
:
public class MainActivity extends FragmentActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
DemoFragment fragmentDemo = (DemoFragment)
getSupportFragmentManager().findFragmentById(R.id.fragmentDemo);
fragmentDemo.doSomething("some param");
}
}
다음엔 을activity
다와 할 수 .fragment
s을 method
.
활동 클래스에서 프래그먼트로 데이터를 보내는 더 나은 접근법은 세터 방법을 통해 전달하는 것입니다.맘에 들다
FragmentClass fragmentClass = new FragmentClass();
fragmentClass.setMyList(mylist);
fragmentClass.setMyString(myString);
fragmentClass.setMyMap(myMap);
그리고 이 자료들을 수업에서 쉽게 얻을 수 있습니다.
다음 인터페이스를 사용하여 활동과 단편 간에 통신합니다.
public interface BundleListener {
void update(Bundle bundle);
Bundle getBundle();
}
또는 인터페이스를 사용하는 양방향 통신을 위해 이 일반 청취자를 따라 사용합니다.
/**
* Created by Qamar4P on 10/11/2017.
*/
public interface GenericConnector<T,E> {
T getData();
void updateData(E data);
void connect(GenericConnector<T,E> connector);
}
프래그먼트 쇼 메소드
public static void show(AppCompatActivity activity) {
CustomValueDialogFragment dialog = new CustomValueDialogFragment();
dialog.connector = (GenericConnector) activity;
dialog.show(activity.getSupportFragmentManager(),"CustomValueDialogFragment");
}
당신은 당신의 문맥을 에 던질 수 있습니다.GenericConnector
인에onAttach(Context)
당신의 활동중에
CustomValueDialogFragment.show(this);
너의 단편에
...
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
connector.connect(new GenericConnector() {
@Override
public Object getData() {
return null;
}
@Override
public void updateData(Object data) {
}
@Override
public void connect(GenericConnector connector) {
}
});
}
...
public static void show(AppCompatActivity activity, GenericConnector connector) {
CustomValueDialogFragment dialog = new CustomValueDialogFragment();
dialog.connector = connector;
dialog.show(activity.getSupportFragmentManager(),"CustomValueDialogFragment");
}
참고: 다음과 같이 사용하지 마십시오."".toString().toString().toString();
길.
이 질문을 우연히 발견했지만 위의 대부분의 방법은 효과가 있을 것입니다.이벤트 버스 라이브러리를 사용할 수 있다는 점만 덧붙이고 싶습니다. 특히 구성 요소(Activity 또는 Fragment)가 생성되지 않은 시나리오에서는 모든 크기의 안드로이드 프로젝트와 많은 사용 사례에 적합합니다.개인적으로 플레이스토어에서 진행하는 여러 프로젝트에서 사용했습니다.
public static 메서드를 fragment에 생성하면 해당 fragment에 대한 정적 참조를 얻은 다음 해당 함수에 데이터를 전달하고 동일한 메서드에서 인수로 설정하고 fragment의 oncreate 메서드에 대해 getArgument를 통해 데이터를 얻은 후 해당 데이터를 로컬 변수로 설정할 수 있습니다.
최신 Navigation Architecture 컴포넌트를 사용하다가 비슷한 문제가 발생했습니다.호출 활동에서 프래그먼트로 번들을 전달하면서 위에 언급한 모든 코드를 시도했습니다.
Android의 최신 개발 동향을 따르는 가장 좋은 해결책은 View Model(안드로이드 제트팩의 일부)을 사용하는 것입니다.
상위 액티비티에서 ViewModel 클래스를 생성하고 초기화합니다. 이 ViewModel은 액티비티와 프래그먼트 간에 공유되어야 합니다.
이제 조각의 onViewCreated() 안에서 동일한 뷰 모델을 초기화하고 ViewModel 필드를 듣도록 Observers를 설정합니다.
필요한 경우 유용하고 상세한 자습서를 제공됩니다.
코틀린 버전:
Activity
:
val bundle = Bundle()
bundle.putBoolean("YourKey1", true)
bundle.putString("YourKey2", "YourString")
val fragment = YourFragment()
fragment.arguments = bundle
val fragmentTransaction = parentFragmentManager.beginTransaction()
fragmentTransaction.replace(R.id.your_container, fragment, fragment.toString())
fragmentTransaction.commit()
Fragment
시():
var value1 = arguments?.getBoolean("YourKey1", default true/false)
var value2 = arguments?.getString("YourKey2", "Default String")
프래그먼트와 활동 사이에 데이터를 전달하는 가장 현명한 방법은 다음과 같은 변수를 만드는 것입니다.
class StorageUtil {
public static ArrayList<Employee> employees;
}
그런 다음 fragment에서 액티비티로 데이터를 전달하기 위해 onActivityCreated 메서드를 사용합니다.
//a field created in the sending fragment
ArrayList<Employee> employees;
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
employees=new ArrayList();
//java 7 and above syntax for arraylist else use employees=new ArrayList<Employee>() for java 6 and below
//Adding first employee
Employee employee=new Employee("1","Andrew","Sam","1984-04-10","Male","Ghanaian");
employees.add(employee);
//Adding second employee
Employee employee=new Employee("1","Akuah","Morrison","1984-02-04","Female","Ghanaian");
employees.add(employee);
StorageUtil.employees=employees;
}
이제 모든 곳에서 StorageUtil. 직원의 가치를 확인할 수 있습니다.행운을 빕니다.
내 해결책은 조각 안에 정적 방법을 쓰는 것입니다.
public TheFragment setData(TheData data) {
TheFragment tf = new TheFragment();
tf.data = data;
return tf;
}
이렇게 하면 프래그먼트와 함께 작동해야 할 수 있는 다른 작업을 수행하기 전에 필요한 모든 데이터가 프래그먼트 내부에 있다고 확신할 수 있습니다.그리고 제 생각에는 더 깨끗해 보입니다.
프래그먼트에서 세터 메소드를 만들 수 있습니다.그런 다음 활동에서 단편을 참조할 때 setter 메서드를 호출하여 데이터를 전달합니다. 활동
3일 동안 고생했는데 해결책이 하나도 안 통했어요 여기 마지막 방법이...
1단계 - 활동과 조각 간의 데이터 공유를 위한 ViewModel 클래스를 만듭니다.
public class MyViewModel extends ViewModel {
private MutableLiveData<String> myData = new MutableLiveData<>();
public void setData(String data) {
myData.setValue(data);
}
public LiveData<String> getData() {
return myData;
}
}
2단계 - 활동에서 ViewModel 인스턴스를 만들고 setData() 메서드를 사용하여 데이터를 설정합니다.
MyViewModel myViewModel = new
ViewModelProvider(this).get(MyViewModel.class);
myViewModel.setData("Hello from Activity!");
3단계 - Fragment에서 ViewModel의 인스턴스를 가져오고 getData() 메서드를 사용하여 데이터를 관찰합니다.
MyViewModel myViewModel = new
ViewModelProvider(requireActivity()).get(MyViewModel.class);
myViewModel.getData().observe(getViewLifecycleOwner(), new
Observer<String>() {
@Override
public void onChanged(@Nullable String data) {
// update UI with the new data
}
});
이 단계를 수행하면 프래그먼트는 활동에 의해 View Model에 설정된 데이터를 수신하고 업데이트할 수 있습니다.ViewModel은 Activity의 범위를 지정하므로 구성 변경 중에 Fragment가 삭제되고 다시 생성되더라도 계속 유지됩니다.
Kotlin : fragment side에 데이터 전송 작업
1단계: 활동
class SurveyInfoActivity : AppCompatActivity(){
private lateinit var surveyPageOneFragment: SurveyPageOneFragment
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivitySurveyInfoBinding.inflate(layoutInflater)
setContentView(binding.root)
init()
}
private fun init() {
context = this
binding.viewPager.isUserInputEnabled = false
surveyPageOneFragment = SurveyPageOneFragment.newInstance(false)
}
/**
* then getting your data any side to put on this method
* ***/
surveyPageOneFragment.setFetchedActivityToFragOne(firstName,middleName,lastName, getMobileNum, getGender, bDay, bMonth, bYear, getAge, getBloodGroup)}
2단계: 프래그먼트 1
fun setFetchedActivityToFragOne(
gFirstName: String?,
gMiddleName : String?,
gLastName: String?,
gMobile: String?,
gGender: String?,
dd: String?,
mm: String?,
yyyy: String?,
gAge: Int?,
gBloodGroup: String?
){
this.gFirstName = gFirstName
this.gMiddleName = gMiddleName
this.gLastName = gLastName
this.gMobile = gMobile
this.gender = gGender
this.bDay = dd
this.bMonth = mm
this.bYear = yyyy
this.niceAge = gAge
this.bloodGroup = gBloodGroup
Log.d("TAG", "Activity get First name: $gFirstName")
Log.d("TAG", "Activity get middle name: $gMiddleName")
Log.d("TAG", "Activity get last name: $gLastName")
Log.d("TAG", "Activity get mobile: $gMobile")
Log.d("TAG", "Activity get Gender: $gGender")
Log.d("TAG", "Activity get birthDay: $dd")
Log.d("TAG", "Activity get birthMonth: $mm")
Log.d("TAG", "Activity get birthYear: $yyyy")
Log.d("TAG", "Activity get age: $gAge")
Log.d("TAG", "Activity get bloodGroup: $gBloodGroup")
getActivityFetchData(gFirstName,gMiddleName, gLastName, gMobile, gGender,dd,mm,yyyy,gAge,gBloodGroup)
}
3단계: 데이터를 가져와 값을 확인하고 텍스트 또는 체크박스를 설정합니다.
private fun getActivityFetchData(
gName: String?,
gMName: String?,
gLName: String?,
gMobile: String?,
gGender: String?,
gdd: String?,
gmm: String?,
gyyyy: String?,
gAge: Int?,
gBloodGroup: String?
){
binding.edtYourName.setText(gName)
binding.edtMiddleName.setText(gMName)
binding.edtLastName.setText(gLName)
binding.edtPhoneCall.setText(gMobile)
when (gGender) {
male -> {
binding.cbMale.isChecked = true
}
female -> {
binding.cbFemale.isChecked = true
}
other -> {
binding.cbTransgender.isChecked = true
}
}
binding.autoDay.setText(gdd)
binding.autoMonth.setText(gmm)
binding.autoYear.setText(gyyyy)
binding.txtAge.text = gAge.toString()
when (gBloodGroup) {
posA -> {
binding.cbPositiveA.isChecked = true
}
posB -> {
binding.cbPositiveB.isChecked = true
}
posAB -> {
binding.cbPositiveAb.isChecked = true
}
posO -> {
binding.cbPositiveO.isChecked = true
}
negA -> {
binding.cbNegativeA.isChecked = true
}
negB -> {
binding.cbNegativeB.isChecked = true
}
negAB -> {
binding.cbNegativeAb.isChecked = true
}
negO -> {
binding.cbNegativeO.isChecked = true
}
}
}
활동에서 정적 변수 선언
public static HashMap<String,ContactsModal> contactItems=new HashMap<String, ContactsModal>();
그러면 당신의 조각에는 따라하기를 바랍니다.
ActivityName.contactItems.put(Number,contactsModal);
언급URL : https://stackoverflow.com/questions/12739909/send-data-from-activity-to-fragment-in-android
'programing' 카테고리의 다른 글
UIScroll모바일 사파리 탭과 같은 수평 페이징 보기 (0) | 2023.10.07 |
---|---|
w3wp clr.dll 오류 디버그 방법 (0) | 2023.10.07 |
git reset --hard HEAD~1'과 'git reset --soft HEAD~1'의 차이점은 무엇입니까? (0) | 2023.10.07 |
프로젝트에서 위험을 고려할 때 -I 포함 스위치를 사용하는 이유는 무엇입니까? (0) | 2023.10.07 |
XML 문서에 HTML 내용을 삽입할 수 있습니까? (0) | 2023.10.07 |