gpt4 book ai didi

java - 如何在 Android 的同一 Activity 中将日期从一个 fragment 传递到另一个 fragment ?

转载 作者:行者123 更新时间:2023-12-02 13:19:25 28 4
gpt4 key购买 nike

我无法将数据(用户从日期小部件中选择的日期)从小部件传递回调用 fragment 并将其设置在按钮上。起始 fragment 成功地将当前日期传递给小部件,但在将用户选择的日期传递回调用 fragment 时遇到问题。

这是起始 fragment 的代码,即 CrimeFragment

package com.khalsa.gurankassingh.criminalintent;


import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.text.Editable;
import android.text.TextWatcher;
import android.text.format.DateFormat;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.EditText;

import java.util.Date;
import java.util.UUID;

/**
* Created by Gurankas Singh on 3/12/2017.
*/

public class CrimeFragment extends Fragment
{
public static final String ARG_CRIME_ID = "crime_id";
public static final String DIALOG_DATE = "DialogDate";

private static final int REQUEST_DATE = 0;

private Crime mCrime; //instance of the Crime class
private EditText mTitleField; // The editable text field in the fragment
private Button mDateButton; //Displays the date of the crime on the button
private CheckBox mSolvedCheckBox; //Displays the current status of the crime; solved or unsolved

public static CrimeFragment newInstance(UUID crimeID) //to pass value to the fragment via an argument to another fragment
{
Bundle args = new Bundle();
args.putSerializable(ARG_CRIME_ID,crimeID);

CrimeFragment fragment = new CrimeFragment();
fragment.setArguments(args);
return fragment;
}

@Override
public void onCreate(@Nullable Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
UUID crimeId = (UUID)getArguments().getSerializable(ARG_CRIME_ID);
mCrime = CrimeLab.get(getActivity()).getCrime(crimeId);

}

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

mTitleField = (EditText) v.findViewById(R.id.crime_title);
mTitleField.setText(mCrime.getTitle());
mTitleField.addTextChangedListener(new TextWatcher()
{
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after)
{

}

@Override
public void onTextChanged(CharSequence s, int start, int before, int count)
{
mCrime.setTitle(s.toString());
}

@Override
public void afterTextChanged(Editable s)
{

}
});

mDateButton = (Button) v.findViewById(R.id.crime_date);
updateDate();
mDateButton.setOnClickListener(new View.OnClickListener()
{

@Override
public void onClick(View v)
{
FragmentManager fragmentManager = getFragmentManager();
DatePickerFragment dialog = DatePickerFragment.newInstance(mCrime.getDate());
setTargetFragment(CrimeFragment.this,REQUEST_DATE);
dialog.show(fragmentManager, DIALOG_DATE);
}
});

mSolvedCheckBox = (CheckBox) v.findViewById(R.id.crime_solved);
mSolvedCheckBox.setChecked(mCrime.isSolved());
mSolvedCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener()
{
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
{
//set the crime's solved property
mCrime.setSolved(isChecked);
}
});

return v;
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data)
{
if (resultCode != Activity.RESULT_OK)
{
return;
}
if (requestCode == REQUEST_DATE)
{
Date date = (Date)data.getSerializableExtra(DatePickerFragment.EXTRA_DATE);
mCrime.setDate(date);
updateDate();
}
}

private void updateDate()
{
mDateButton.setText(DateFormat.format("EEEE, d MMMM, yyy", mCrime.getDate()));
}
}

这是由 DatePickerFragment 托管的 datePicker 小部件的代码

package com.khalsa.gurankassingh.criminalintent;

import android.app.Activity;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.DialogFragment;
import android.support.v7.app.AlertDialog;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.DatePicker;

import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

/**
* Created by Gurankas Singh on 4/9/2017.
*/

public class DatePickerFragment extends DialogFragment
{
private static final String DATE_ARG = "date";
public static final String EXTRA_DATE = "com.khalsa.gurankassingh.criminalintent.date";

private DatePicker mDatePicker;

public static DatePickerFragment newInstance(Date date)
{
Bundle args = new Bundle();
args.putSerializable(DATE_ARG,date);

DatePickerFragment fragment = new DatePickerFragment();
fragment.setArguments(args);
return fragment;
}

@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState)
{
Date date = (Date)getArguments().getSerializable(DATE_ARG);

Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH);
int day = calendar.get(Calendar.DAY_OF_MONTH);

View v = LayoutInflater.from(getActivity()).inflate(R.layout.dialog_date,null);

mDatePicker = (DatePicker)v.findViewById(R.id.dialog_date_date_picker);
mDatePicker.init(year,month,day,null);

return new AlertDialog.Builder(getActivity()).setView(v).setTitle(R.string.date_picker_title).setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
int year = mDatePicker.getYear();
int month = mDatePicker.getMonth();
int day = mDatePicker.getDayOfMonth();
Date date = new GregorianCalendar(year, month, day).getTime();
sendResult(Activity.RESULT_OK, date);
}
}).create();
}
private void sendResult(int resultCode, Date date)
{
if (getTargetFragment() == null)
{
return;
}
Intent intent = new Intent();
intent.putExtra(EXTRA_DATE,date);

getTargetFragment().onActivityResult(getTargetRequestCode(), resultCode, intent);
}

}

最佳答案

要在Fragments之间传递数据,您需要知道的是:

1- 当您在 Activity 中创建 Fragment 时,要将数据从 Activity 传递到 Fragment 使用对象实例> 您有一个实例,因此可以使用它来传递数据,如下所示:

class Activity1 extend AppCompatActivity {

Fragment1 fragment;

void doSomethingInFramgent() {

fragment.doSomething();
}
}

2-要将数据从 Fragment 传递到 Activity,请使用 Interface,创建一个 Interface 并使用以下内容步骤:

2-1- 创建一个Interface文件:

public interface FragmentInteraction {
void doSomethingInActivity();
}

2-2- 在Activity中实现Interface:

 class Activity1 extend AppCompatActivity implement FragmentInteraction {

void doSomethingInActivity() {
// do whatever you need
}
}

2-3-从Interface创建一个对象并在onAttach中初始化它,如下所示:

   class Fragment1 extend Fragment {

FragmentInteraction fragmentInteraction;

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

if (context instanceof FragmentInteraction) {
fragmentInteraction = (FragmentInteraction) context;
}
}

}

2-4- 使用Interface实例调用Activity中的方法,如下所示:

fragmentInteraction.doSomethinInActivity();

利用这一概念,您可以在 FragmentsActivity 之间传递数据,例如,如果您希望将数据从一个 fragment 传递到不同 Activity 中的另一个 fragment ,您可以:

Activity 1, fragment 1。 Activity 2, fragment 2

使用Interface将数据从Fragment1传递到Activity1,使用startActivityForResult启动Activity2 >,用fragment2对象传递数据,用Interface返回数据到Activity2然后使用setResult返回到 Activity 1

PS:如果你想在创建Fragment对象时传递数据,可以使用Argument来传递数据。

为此目的,您可以使用以下方法:

1-为获取 fragment 实例创建静态方法:

 public static Fragment1 getInstance(String data1) {

Fragment1 fragment = new Fragment1();

Bundle bundle = new Bundle();
bundle.putString(KEY, data1);
fragment.setArguments(bundle);

return fragment;
}

然后在 onViewCreate 上的 onCreateView 中获取数据,如下所示:

 if (getArguments() != null) {
data = getArguments().getString(KEY);
}

关于java - 如何在 Android 的同一 Activity 中将日期从一个 fragment 传递到另一个 fragment ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43625784/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com