【问题标题】:Can not send data from Activity to fragment on Android Studio无法将数据从 Activity 发送到 Android Studio 上的片段
【发布时间】:2019-10-10 09:59:23
【问题描述】:

从片段我打开一个活动然后我想从这个活动发送数据到那个片段。但是该数据未显示在片段上

这里是扩展片段类

public final class AddEditAlarmFragment extends Fragment {
private TimePicker mTimePicker;
private EditText mLabel,mPath;
private CheckBox mMon, mTues, mWed, mThurs, mFri, mSat, mSun;
public static AddEditAlarmFragment newInstance(Alarm alarm) {
    Bundle args = new Bundle();
    args.putParcelable(AddEditAlarmActivity.ALARM_EXTRA, alarm);
    AddEditAlarmFragment fragment = new AddEditAlarmFragment();
    fragment.setArguments(args);
    return fragment;
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    final View v = inflater.inflate(R.layout.fragment_add_edit_alarm, container, false);
    setHasOptionsMenu(true);
    final Alarm alarm = getAlarm();
    mTimePicker = (TimePicker) v.findViewById(R.id.edit_alarm_time_picker);
    ViewUtils.setTimePickerTime(mTimePicker, alarm.getTime());
    mLabel = (EditText) v.findViewById(R.id.edit_alarm_label);
    mLabel.setText(alarm.getLabel());
    mPath = (EditText) v.findViewById(R.id.edit_alarm_path);
 // event to go PathActivity
    mPath.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent intend = new Intent(getActivity(), PathActivity.class);
            startActivity(intend);              
        }
    });

    String strtext = getArguments().getString("edttext");
    mLabel.setText(strtext);

    setDayCheckboxes(alarm);

    return v;
}

这里是扩展 AppCompatActivity 类

public class PathActivity extends AppCompatActivity {
private final static int READ_EXTERNAL_STORAGE_PERMISSION_REQUEST_CODE = 13;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView( R.layout.path_activity);
    int permissionCheck = ContextCompat.checkSelfPermission(this,
            Manifest.permission.READ_EXTERNAL_STORAGE);
    if (permissionCheck != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(this,
                new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
                READ_EXTERNAL_STORAGE_PERMISSION_REQUEST_CODE);
    } else {
        addFileChooserFragment();
    }
}
private void addFileChooserFragment() {
    FileChooser.Builder builder = new FileChooser.Builder(FileChooser.ChooserType.FILE_CHOOSER,
            new FileChooser.ChooserListener() {
 // Send back data to mPath(Edittext) of AddEditAlarmFragment class
                @Override
                public void onSelect(String path) {
                    File selected= new File(path);
                    Bundle bundle = new Bundle();
                    bundle.putString("edttext", selected.getParent().toString());
                    AddEditAlarmFragment fragobj = new AddEditAlarmFragment();
                    fragobj.setArguments(bundle);
                    finish();
                }
            });
    try {
        getSupportFragmentManager().beginTransaction()
                .add(R.id.file_chooser_fragment_container_framelayout, builder.build())
                .commit();
    } catch (ExternalStorageNotAvailableException e) {
        Toast.makeText(this, "There is no external storage available on this device.",
                Toast.LENGTH_SHORT).show();
        e.printStackTrace();
    }
}
}

这对我来说真的是一个挑战。我是 android studio 的新手。我正在寻找您的来信。谢谢

【问题讨论】:

    标签: android android-fragments android-intent


    【解决方案1】:

    在你的片段内部:

    替换

    startActivity(intend);  
    

    startActivityForResult(intend, 100);
    

    在 onSelect() 方法中的 PathActivity 内部使用此代码将数据发送回片段:

    Intent resultIntent = new Intent();
    resultIntent.putExtra("edttext", selected.getParent().toString());
    setResult(Activity.RESULT_OK, resultIntent);
    finish();
    

    现在要在片段中获取数据,请在片段类中编写以下代码:

    @Override
    public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if(resultCode == Activity.RESULT_OK){
            if(requestCode == 100){
                // here comes the data from activity
                String text = data.getStringExtra("edttext");
            }
        }
    }
    

    【讨论】:

      【解决方案2】:

      有一些简单的代码块可以将数据从 Activity 传递到片段。 第 1 步:将数据从 Activity 传递到 Fragment,

      Bundle bundle = new Bundle();
      bundle.putString("params", "My String data");
      // set MyFragment Arguments
      MyFragment myObj = new MyFragment();
      myObj.setArguments(bundle);
      

      第 2 步:将数据接收到 Fragment,

      public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          if (getArguments() != null) {
              mParam1 = getArguments().getString("params");
          }
      }
      

      sourceLink

      【讨论】:

        【解决方案3】:

        请使用以下sn-p,注意不要使用getActivity().startActivityForResult()否则会触发onActivityResult()的活动

        AddEditAlarmFragment.java

        public final class AddEditAlarmFragment extends Fragment {
            private TimePicker mTimePicker;
            private EditText mLabel,mPath;
            private CheckBox mMon, mTues, mWed, mThurs, mFri, mSat, mSun;
            public static AddEditAlarmFragment newInstance(Alarm alarm) {
                Bundle args = new Bundle();
                args.putParcelable(AddEditAlarmActivity.ALARM_EXTRA, alarm);
                AddEditAlarmFragment fragment = new AddEditAlarmFragment();
                fragment.setArguments(args);
                return fragment;
            }
            @Nullable
            @Override
            public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
                final View v = inflater.inflate(R.layout.fragment_add_edit_alarm, container, false);
                setHasOptionsMenu(true);
                final Alarm alarm = getAlarm();
                mTimePicker = (TimePicker) v.findViewById(R.id.edit_alarm_time_picker);
                ViewUtils.setTimePickerTime(mTimePicker, alarm.getTime());
                mLabel = (EditText) v.findViewById(R.id.edit_alarm_label);
                mLabel.setText(alarm.getLabel());
                mPath = (EditText) v.findViewById(R.id.edit_alarm_path);
             // event to go PathActivity
                mPath.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        Intent intend = new Intent(getActivity(), PathActivity.class);
                        startActivityForResult(intend,100);              
                    }
                });
        
                String strtext = getArguments().getString("edttext");
                mLabel.setText(strtext);
        
                setDayCheckboxes(alarm);
        
                return v;
            }
        
            @Override
            public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        
                if(resultCode == Activity.RESULT_OK){
                    if(requestCode == 100){
                        // here comes the data from activity
                        String path = data.getStringExtra("path");
                        // use path
                        return;
                    }
                }
                super.onActivityResult(requestCode, resultCode, data);
            }
        }
        

        PathActivity.java

        public class PathActivity extends AppCompatActivity {
            private final static int READ_EXTERNAL_STORAGE_PERMISSION_REQUEST_CODE = 13;
            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView( R.layout.path_activity);
                int permissionCheck = ContextCompat.checkSelfPermission(this,
                        Manifest.permission.READ_EXTERNAL_STORAGE);
                if (permissionCheck != PackageManager.PERMISSION_GRANTED) {
                    ActivityCompat.requestPermissions(this,
                            new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
                            READ_EXTERNAL_STORAGE_PERMISSION_REQUEST_CODE);
                } else {
                    addFileChooserFragment();
                }
            }
            private void addFileChooserFragment() {
                FileChooser.Builder builder = new FileChooser.Builder(FileChooser.ChooserType.FILE_CHOOSER,
                        new FileChooser.ChooserListener() {
             // Send back data to mPath(Edittext) of AddEditAlarmFragment class
                            @Override
                            public void onSelect(String path) {
                                Intent resultIntent = new Intent();
                                resultIntent.putExtra("edttext", selected.getParent().toString());
                                setResult(Activity.RESULT_OK, resultIntent);
                                finish();
                            }
                        });
                try {
                    getSupportFragmentManager().beginTransaction()
                            .add(R.id.file_chooser_fragment_container_framelayout, builder.build())
                            .commit();
                } catch (ExternalStorageNotAvailableException e) {
                    Toast.makeText(this, "There is no external storage available on this device.",
                            Toast.LENGTH_SHORT).show();
                    e.printStackTrace();
                }
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-05-20
          • 2017-02-07
          • 1970-01-01
          • 1970-01-01
          • 2019-07-17
          相关资源
          最近更新 更多