[英]How to pass date from one fragment to another in the same activity in Android?
我在将数据(用户从“日期”小部件中选择的日期”)从小部件传递回调用片段并将其设置在“按钮”上时遇到麻烦。 起始片段成功地将当前日期传递给窗口小部件,但是将用户选择的日期传递回调用片段时遇到麻烦。
这是开始片段的代码,即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 arguement 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
像下面这样在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();
有了这个概念,您就可以在Fragments
和Activity
之间传递数据,例如,如果要将数据从一个片段传递到另一个Activity中的另一个片段,则可以:
活动1,片段1。 活动2,片段2
与通过数据Interface
从Fragment1
至Activity1
,启动Activity2
与startActivityForResult
,通过与数据fragment2
对象,具有返回数据Interface
到Activity2
然后使用setResult
并返回到Activity1
PS:如果要在创建Fragment
对象时传递数据,则可以使用Argument
传递数据。
为此,您可以使用以下方法:
1-为获取片段实例创建静态方法:
public static Fragment1 getInstance(String data1) {
Fragment1 fragment = new Fragment1();
Bundle bundle = new Bundle();
bundle.putString(KEY, data1);
fragment.setArguments(bundle);
return fragment;
}
然后在onCreateView
上onViewCreate
让您的数据,如:
if (getArguments() != null) {
data = getArguments().getString(KEY);
}
您可以尝试以下解决方案:-
=>更改CrimeFragment中的以下代码
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data)
{
if (resultCode != Activity.RESULT_OK)
{
return;
}
if (requestCode == REQUEST_DATE)
{
long dateValue = data.getLongExtra(DatePickerFragment.EXTRA_DATE,System.currentTimeMillis());
Date date = new Date(dateValue);
mCrime.setDate(date);
updateDate();
}
}
并在DatePickerFragment中更改以下代码:-
private void sendResult(int resultCode, Date date)
{
if (getTargetFragment() == null)
{
return;
}
Intent intent = new Intent();
intent.putExtra(EXTRA_DATE, date.getTime());
getTargetFragment().onActivityResult(getTargetRequestCode(), resultCode, intent);
}
....
您好,尝试这种方法,
您可以使用共享首选项存储日期,以后可以在需要时访问它,这很容易处理。请记住日期格式,并相应地选择SimpleDateFormat,因为如果输入日期的格式不正确,则会出现解析错误相同。
写入共享首选项
SharedPreferences sharedpreferences;
sharedpreferences = getSharedPreferences("myPref", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedpreferences.edit();
editor.putString("Date",String.valueOf(date);
editor.commit();
必要时阅读SharedPreferences
SharedPreferences prefs = this.getSharedPreferences("myPref", Context.MODE_PRIVATE);
String dateCrime = prefs.getString("Date", null);
//Chose Date format depending on your date
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
try {
Date date = format.parse(dateCrime);
} catch (ParseException e) {
e.printStackTrace();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.