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做,但它不起作用

在my
FilterActivity
中,
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:美国