问题描述
我发现很难从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);
}
}