如何从Android中的BottomSheetDialogFragment调用片段

问题描述

我发现很难从BottomSheetDialog调用MainFragment中的InsertSlider。 任何帮助和感谢

在BottomSheet中:

public class AdminBottomSheetMainSave extends BottomSheetDialogFragment
{
 // One Method I don.t KNow How To Work                  
 //((MainFragment)getContext()).InsertSliders(new ImageSlider(0,Name,Image,Price,Description));
 // Not Work Too
    MainFragment fragment = new MainFragment();
    fragment.InsertSliders(new ImageSlider(0,Description));
}

在片段中:

public class MainFragment extends Fragment
{
public void InsertSliders(ImageSlider imageSlider)
{
    imageSliderviewmodel.insert(imageSlider);
    Toast.makeText(getActivity(),"Done Insert"+imageSlider,Toast.LENGTH_SHORT).show();
}

如何联系InsertSliders

解决方法

您应该使用接口在两个片段之间进行通信,并且需要一个活动来实现该接口。

在底页对话框片段中定义界面:

import authConfig from "./authConfig";
import {Auth0Client} from '@auth0/auth0-spa-js';

const auth0 = new Auth0Client({
    domain: authConfig.domain,client_id: authConfig.clientID,cacheLocation: 'localstorage',useRefreshTokens: true
});

const CallbackURI = "http://localhost:3000/login"

export default {
    // called when the user attempts to log in
    login: (url) => {
        if (typeof url === 'undefined') {
            return auth0.loginWithRedirect({
                redirect_uri: CallbackURI
            })
        }
        return auth0.handleRedirectCallback(url.location);
    },// called when the user clicks on the logout button
    logout: () => {
        return auth0.isAuthenticated().then(function (isAuthenticated) {
            if (isAuthenticated) { // need to check for this as react-admin calls logout in case checkAuth failed
                return auth0.logout({
                    redirect_uri: window.location.origin,federated: true // have to be enabled to invalidate refresh token
                });
            }
            return Promise.resolve()
        })
    },// called when the API returns an error
    checkError: ({status}) => {
        if (status === 401 || status === 403) {
            return Promise.reject();
        }
        return Promise.resolve();
    },// called when the user navigates to a new location,to check for authentication
    checkAuth: () => {
        return auth0.isAuthenticated().then(function (isAuthenticated) {
            if (isAuthenticated) {
                return Promise.resolve();
            }
            return auth0.getTokenSilently({
                redirect_uri: CallbackURI
            })
        })
    },to check for permissions / roles
    getPermissions: () => {
        return Promise.resolve()
    },};

然后在我们的案例中,在您的活动中MainActivity实现Callback接口并覆盖inserSlider方法:

public class AdminBottomSheetMainSave extends BottomSheetDialogFragment
{
    public Callback mCallback;

  public interface Callback{
   void insertSlider(ImageSlider slider);
  }

 @Override
  public void onAttach(Activity activity){
 super.onAttach(activity);
 mCallback = (Callback) activity;
}
 @Override
public void onViewCreated(@NonNull View view,@Nullable Bundle savedInstanceState) {
    super.onViewCreated(view,savedInstanceState);
//...

mCallback.insertSlider(new ImageSlider(0,Name,Image,Price,Description));
  }
}

现在在您的MainFragment中:

 public class MainActivity extends AppCompatActivity implements Callback{
  MainFragment mainFragment;
  @Override
  public void onCreate(Bundle savedInstanceState){
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);
  //...
  if(savedInstanceState == null){
     mainFragment = MainFragment.newInstance(new Bundle()); // use real bundle here
     getSupportFragmentManager()
         .beginTransaction()
         .add(R.id.fragment_holder,mainFragment,"FragMain").commit();
   }
  }
 // Interface method
 @Override
 public void insertSlider(ImageSlider slider){
 if(mainFragment != null){
      mainFragment.insertSlider(slider);
    }
 }