Как ввести переменный тип Fragment в метод? - PullRequest
0 голосов
/ 29 января 2020

Я использую метод в библиотеке, но не могу указать правильный параметр.

public class CutFragment extends Fragment {
btnPickAudioPath1.setOnClickListener(new View.OnClickListener() {
      @Override public void onClick(View view) {


        new MaterialFilePicker()
                .withFragment(CutFragment.this) // getting error here
                .withRequestCode(1000)
                .withFilter(Pattern.compile(".*\\.mp3$")) // Filtering files and directories by file name using regexp
                .withHiddenFiles(true) // Show hidden files and folders
                .start();

      }
    });
}

Это метод в библиотеке

/**
 * Specifies fragment, which will be used to
 * start file picker
 */
public MaterialFilePicker withFragment(Fragment fragment) {
    if (mSupportFragment != null || mActivity != null) {
        throw new RuntimeException("You must pass either Activity, Fragment or SupportFragment");
    }

    mFragment = fragment;
    return this;
}

Обычно если мы указываем активность, мы будем использовать MainActivity.this, поэтому, если указать фрагмент, как мы получим фрагмент? Спасибо.

Это сообщения об ошибках.

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.auroralife, PID: 1745
    java.lang.RuntimeException: You must pass Activity/Fragment by calling withActivity/withFragment/withSupportFragment method
        at com.nbsp.materialfilepicker.MaterialFilePicker.start(MaterialFilePicker.java:217)
        at com.example.auroralife.Fragment.CutFragment$2.onClick(CutFragment.java:123)
        at android.view.View.performClick(View.java:5610)
        at android.view.View$PerformClick.run(View.java:22265)
        at android.os.Handler.handleCallback(Handler.java:751)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:154)
        at android.app.ActivityThread.main(ActivityThread.java:6077)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)

Если я использую getActivity ()

Ответы [ 2 ]

0 голосов
/ 29 января 2020

вы можете вызвать эту функцию MaterialFilePacker для вашего класса активности

В классе Activity определите фрагмент глобально:

CutFragment cutFragment;

и определите функцию, которая вызывает ваш метод

private void a(){
           new MaterialFilePicker() // remove fragment row
                .withRequestCode(REQUEST_CODE)
                .withFilter(Pattern.compile(".*\\.mp3$")) // Filtering files and directories by file name using regexp
                .withHiddenFiles(true) // Show hidden files and folders
                .start();
}

на результат вашей деятельности

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == REQUEST_CODE && resultCode == Activity.RESULT_OK) {
           cutFragment.b()
        }
}

В вашем фрагменте определите функцию для вашей задачи

public void b(){
 //todo
}
0 голосов
/ 29 января 2020

Пожалуйста, попробуйте это

new MaterialFilePicker()
        .withSupportFragment(this) //try this
        .withRequestCode(FILE_PICKER_REQUEST_CODE)
        .withHiddenFiles(true)
        .start();

И чтобы получить ответ вы можете позвонить onActivityResult

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == FILE_PICKER_REQUEST_CODE && resultCode == Activity.RESULT_OK) {
        String path = data.getStringExtra(FilePickerActivity.RESULT_FILE_PATH);

        if (path != null) {
            Log.d("Path (fragment): ", path);
            Toast.makeText(getContext(), "Picked file in fragment: " + path, Toast.LENGTH_LONG).show();
        }
    }
}

Надеюсь, это поможет! :)

...