Android 将活动中的数据发送到不同的片段
我有一个Android 将活动中的数据发送到不同的片段,android,android-fragments,Android,Android Fragments,我有一个main活动,其中有一个微调器,它有三个项目。这些项目用于在MainActivity framelayout中充气三个不同的碎片 现在我有了另一个FilterActivity,我可以通过单击main活动中的menuItem获得它。因此,我的FilterActivity与MainActivity相连 在FilterActivity中,我有三个单选按钮。当我选中任何单选按钮并单击“确定”按钮时,它将使我进入main活动 我想要的是从FilterActivity中获取所有三个片段的值。就像我选
main活动
,其中有一个微调器,它有三个项目。这些项目用于在MainActivity framelayout
中充气三个不同的碎片
现在我有了另一个FilterActivity
,我可以通过单击main活动中的menuItem
获得它。因此,我的FilterActivity
与MainActivity
相连
在FilterActivity
中,我有三个单选按钮。当我选中任何单选按钮并单击“确定”按钮时,它将使我进入main活动
我想要的是从FilterActivity
中获取所有三个片段的值。就像我选中了filterActivity
中的任何单选按钮一样,它的相关数据应该在所有三个片段中都可用
我试着用Bundle做,但它不起作用
在myFilterActivity
中,ReportType
是我要发送此数据的片段
else if (item.getItemId() == R.id.btn_check_filter)
{
Bundle bundle = new Bundle();
bundle.putString("Expense", EXPENSE_TYPE);
ReportType reportType = new ReportType();
reportType.setArguments(bundle);
finish();
}
在同一个片段中,我试图通过这样做来获得这个值
Bundle bundle = this.getArguments();
String expenseType1 = bundle.getString("Expense");
但这给了我NullPointerException,这意味着捆绑包没有价值
这是我的过滤功能
public class Filter extends AppCompatActivity implements View.OnClickListener {
private LinearLayout allTypeWrapper, incomeTypeWrapper, expenseTypeWrapper;
private ImageView imgAllType, imgIncome, imgExpense;
private String EXPENSE_TYPE;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_filter);
//Expense Type wrappers
allTypeWrapper = findViewById(R.id.all_type_wrapper);
incomeTypeWrapper = findViewById(R.id.income_type_wrapper);
expenseTypeWrapper = findViewById(R.id.expense_type_wrapper);
allTypeWrapper.setOnClickListener(this);
incomeTypeWrapper.setOnClickListener(this);
expenseTypeWrapper.setOnClickListener(this);
//Expense type images
imgAllType = findViewById(R.id.img_all_type);
imgIncome = findViewById(R.id.img_income);
imgExpense = findViewById(R.id.img_expense);
ActionBar actionBar = getSupportActionBar();
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setTitle("Filter");
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu_check_reset, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
if (item.getItemId() == R.id.btn_restore_filter)
{
}
else if (item.getItemId() == R.id.btn_check_filter)
{
Intent intent = new Intent();
intent.putExtra("Expense", EXPENSE_TYPE);
setResult(Activity.RESULT_OK, intent);
finish();
}
else if (item.getItemId() == android.R.id.home)
{
onBackPressed();
}
return super.onOptionsItemSelected(item);
}
@Override
public void onClick(View view) {
int id = view.getId();
//Expense type
if (id == R.id.all_type_wrapper)
{
EXPENSE_TYPE = "ALL";
imgAllType.setImageResource(R.drawable.ic_rb_checked);
imgIncome.setImageResource(R.drawable.ic_rb_unchecked);
imgExpense.setImageResource(R.drawable.ic_rb_unchecked);
}
else if (id == R.id.income_type_wrapper)
{
EXPENSE_TYPE = "INCOME";
imgAllType.setImageResource(R.drawable.ic_rb_unchecked);
imgIncome.setImageResource(R.drawable.ic_rb_checked);
imgExpense.setImageResource(R.drawable.ic_rb_unchecked);
}
else if (id == R.id.expense_type_wrapper)
{
EXPENSE_TYPE = "EXPENSE";
imgAllType.setImageResource(R.drawable.ic_rb_unchecked);
imgIncome.setImageResource(R.drawable.ic_rb_unchecked);
imgExpense.setImageResource(R.drawable.ic_rb_checked);
}
}
}
我希望有人向我解释如何从活动中获取值并将其传递给不同的片段。您可以使用Android中的设置参数发送数据
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);
}
使用添加片段方法。您可以使用Android中的设置参数发送数据
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);
}
使用添加片段方法。您说您正在使用的片段托管在您的MainActivity上,这意味着您已经使用MainActivty创建了这些片段实例。但是您正在尝试创建一个新实例,并在不是片段宿主的fitleActivity上设置参数。以你接近的方式,这是行不通的
您可以尝试从您的过滤器活动到您的主活动获取费用类型,然后在MainActivity中使用参数中的EXPENSE\u类型重新创建片段。您说您正在使用的片段托管在您的MainActivity上,这意味着您已经使用MainActivty创建了这些片段实例。但是您正在尝试创建一个新实例,并在不是片段宿主的fitleActivity上设置参数。以你接近的方式,这是行不通的
您可以尝试从您的过滤器活动到您的主活动获取费用类型,然后在MainActivity中重新创建片段,并在其参数中使用EXPENSE\u TYPE。在您的FilterActivity
On单选按钮中单击listener添加以下代码:
Intent intent=new Intent();
intent.putExtra( "key1", values);// add values to intent you want to send to MainActivity.
intent.putExtra( "key2", values);
setResult(2,intent);
finish();
在main活动中
添加以下代码以启动FilterActivity
:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId( );
if (id == R.id.your_Id)
Intent intent = new Intent( getApplicationContext( ),FilterActivity.class);
startActivityForResult( intent, 2);
}
return super.onOptionsItemSelected( item );
}
选择无线电选项后,startActivityForResult
将从FilterActivity
返回数据。将此功能添加到您的main活动中
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult( requestCode, resultCode, data );
if (requestCode == 2) {
String yourValues = data.getIntExtra( "key1", 0 );
//create the bundle here to send data to the fragment
}
}
现在将yourValues
添加到bundle中(希望您自己可以这样做),然后将这些bundle发送到您的片段中。
如果有帮助,请告诉我:)在您的FilterActivity
On单选按钮中单击listener添加以下代码:
Intent intent=new Intent();
intent.putExtra( "key1", values);// add values to intent you want to send to MainActivity.
intent.putExtra( "key2", values);
setResult(2,intent);
finish();
在main活动中
添加以下代码以启动FilterActivity
:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId( );
if (id == R.id.your_Id)
Intent intent = new Intent( getApplicationContext( ),FilterActivity.class);
startActivityForResult( intent, 2);
}
return super.onOptionsItemSelected( item );
}
选择无线电选项后,startActivityForResult
将从FilterActivity
返回数据。将此功能添加到您的main活动中
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult( requestCode, resultCode, data );
if (requestCode == 2) {
String yourValues = data.getIntExtra( "key1", 0 );
//create the bundle here to send data to the fragment
}
}
现在将yourValues
添加到bundle中(希望您自己可以这样做),然后将这些bundle发送到您的片段中。
如果有帮助,请告诉我:)因此,当您按下FilterActivity
上的OK
按钮时,将进入MainActivity
您可以使用startActivityForResult
调用您的FilterActivity
,并使用setResult
将数据传递到主活动
从main活动
Intent i = new Intent(this, FilterActivity.class);
startActivityForResult(i, 1);
public class MainActivity extends Activity {
private String result = "initial value";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
...
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == 1) {
if(resultCode == Activity.RESULT_OK){
result = data.getStringExtra("Expense");
}
if (resultCode == Activity.RESULT_CANCELED) {
//Write your code if there's no result
}
}
}
// to access your data from fragements
public String getMyData() {
return result;
}
}
在FilterActivity
中将数据传递给主活动
else if (item.getItemId() == R.id.btn_check_filter){
Intent returnIntent = new Intent();
returnIntent.putExtra("Expense",EXPENSE_TYPE);
setResult(Activity.RESULT_OK,returnIntent);
finish();
}
在您的main活动中
Intent i = new Intent(this, FilterActivity.class);
startActivityForResult(i, 1);
public class MainActivity extends Activity {
private String result = "initial value";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
...
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == 1) {
if(resultCode == Activity.RESULT_OK){
result = data.getStringExtra("Expense");
}
if (resultCode == Activity.RESULT_CANCELED) {
//Write your code if there's no result
}
}
}
// to access your data from fragements
public String getMyData() {
return result;
}
}
从片段
中,您可以访问您的值,如
public class YourFragment extends Fragment {
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
MainActivity activity = (MainActivity) getActivity();
String dataFromActivity = activity.getMyData();
Log.d("TAG", "Your data from activity "+dataFromActivity);
}
}
更新
在您的FilterActivity
中,您可以检查是否设置了EXPENSE\u类型
else if (item.getItemId() == R.id.btn_check_filter){
if(TextUtils.isEmpty(EXPENSE_TYPE)){
// show toast or log that you have to select an expense type
return false;
}
// EXPENSE_TYPE is not null or empty
Intent intent = new Intent();
intent.putExtra("Expense", EXPENSE_TYPE);
setResult(Activity.RESULT_OK, intent);
finish();
}
因此,当您按下FilterActivity
上的OK
按钮时,它会让您进入main活动
您可以使用startActivityForResult
调用您的FilterActivity
,并使用setResult
将数据传递到主活动
从main活动
Intent i = new Intent(this, FilterActivity.class);
startActivityForResult(i, 1);
public class MainActivity extends Activity {
private String result = "initial value";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
...
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == 1) {
if(resultCode == Activity.RESULT_OK){
result = data.getStringExtra("Expense");
}
if (resultCode == Activity.RESULT_CANCELED) {
//Write your code if there's no result
}
}
}
// to access your data from fragements
public String getMyData() {
return result;
}
}
在FilterActivity
中将数据传递给主活动
else if (item.getItemId() == R.id.btn_check_filter){
Intent returnIntent = new Intent();
returnIntent.putExtra("Expense",EXPENSE_TYPE);
setResult(Activity.RESULT_OK,returnIntent);
finish();
}
在您的main活动中
Intent i = new Intent(this, FilterActivity.class);
startActivityForResult(i, 1);
public class MainActivity extends Activity {
private String result = "initial value";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
...
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == 1) {
if(resultCode == Activity.RESULT_OK){
result = data.getStringExtra("Expense");
}
if (resultCode == Activity.RESULT_CANCELED) {
//Write your code if there's no result
}
}
}
// to access your data from fragements
public String getMyData() {
return result;
}
}
从片段
中,您可以访问您的值,如
public class YourFragment extends Fragment {
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
MainActivity activity = (MainActivity) getActivity();
String dataFromActivity = activity.getMyData();
Log.d("TAG", "Your data from activity "+dataFromActivity);
}
}
更新
在您的FilterActivity
中,您可以检查是否设置了EXPENSE\u类型
else if (item.getItemId() == R.id.btn_check_filter){
if(TextUtils.isEmpty(EXPENSE_TYPE)){
// show toast or log that you have to select an expense type
return false;
}
// EXPENSE_TYPE is not null or empty
Intent intent = new Intent();
intent.putExtra("Expense", EXPENSE_TYPE);
setResult(Activity.RESULT_OK, intent);
finish();
}
有很多方法可以将数据从活动发送到同一活动中存在的不同片段
方法1:-使用事件总线,如或
就我而言,GreenRobert很容易学习和实现
方法2:-使用简单易学的广播接收器
方法3:-使用Bundle将数据发送到您的片段有很多方法可以将数据从您的活动发送到同一活动中存在的不同片段
方法1:-使用事件总线,如或
就我而言,GreenRobert很容易学习和实现
方法2:-使用简单易学的广播接收器
方法3:美国