Передать значение из Fragment WebView в MainActivity - PullRequest
0 голосов
/ 12 ноября 2019

Получив определенное значение во фрагменте через @Javascriptinterface, я хочу передать это значение в MainActivity, чтобы выполнить какое-то действие с этой переменной. Фрагмент должен быть закрыт.

MainActivity:

public class MainActivity extends AppCompatActivity
        implements NavigationView.OnNavigationItemSelectedListener {

    private WebView WebView;
    private ProgressBar progressBar;
    private Menu menu;
    .......
    .......

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        final DrawerLayout drawer = findViewById(R.id.drawer_layout);
        final ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
                this, drawer, toolbar, R.string.navigation_drawer_open , R.string.navigation_drawer_close);
        drawer.addDrawerListener(toggle);
        toggle.syncState();

        NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
        final Menu navigationMenu = navigationView.getMenu();
        navigationView.setNavigationItemSelectedListener(this);

        WebView = (WebView) findViewById(R.id.webview);

        WebSettings webSettings = WebView.getSettings();
        webSettings.setJavaScriptEnabled(true);
        webSettings.setJavaScriptCanOpenWindowsAutomatically(true);
        webSettings.supportMultipleWindows();
        ......
        WebView.setWebViewClient(new MyWebViewClient());
        WebView.loadUrl(webview_url);
        WebView.setWebChromeClient(new MyWebChromeClient());
        ..............


    }

    public void getFragmentValue(String val ){
        Toast.makeText(this, "open: "+val, Toast.LENGTH_LONG);
    }

    Fragment fragmentWeb = new MainFragment();
    FragmentManager ft = getSupportFragmentManager();
    public boolean checkMenuItemEnable = false;
    public int TitleSize;
    public int idItem;

    @Override
    public void onBackPressed() {
        NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);

        if (drawer.isDrawerOpen(GravityCompat.START)) {
            drawer.closeDrawer(GravityCompat.START);
        } else {
            clearStack();
            getMyData();
            switch (dataFrag) {
                    case ("preference"):
                        idItem = R.id.action_settings;
                        break;
                    case ("bookmark"):
                        idItem = R.id.menu_bookmark;
                        break;
                    case ("myplaces"):
                        idItem = R.id.menu_added;
                        break;
            }

            MenuItem PfMenuItem = navigationView.getMenu().findItem(idItem);
            PfMenuItem.setEnabled(true);                                    <--- Thats no work

            dataFrag = "none";
            setHomeScreen();

        }
    }

    private String dataFrag = "none";

    public String getMyData() {
        return dataFrag;
    }

    public void setHomeScreen() {
        setTitleMain(R.string.app_name);
        setLogoMain(android.R.drawable.list_selector_background);
        setTitleSize(7);
    }

    @Override
    public boolean onNavigationItemSelected(MenuItem item) {
        int id = item.getItemId();

        if (checkMenuItemEnable) {
            if (Build.VERSION.SDK_INT >= 26) {
                ft.beginTransaction().setReorderingAllowed(false);
            }
            ft.beginTransaction().detach(fragmentWeb).attach(fragmentWeb).commit();
        } else {
            ft.beginTransaction().replace(R.id.mainlayout, fragmentWeb, dataFrag).addToBackStack(null).commit();
        }

        checkMenuItemEnable = true;
        item.setEnabled(false);

        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        drawer.closeDrawer(GravityCompat.START);

        return true;
    }

}

MainFragment:

public class MainFragment extends Fragment implements OnBackPressed {

    public MainFragment() {
    }

    private WebView WebView;
    ..........
    ..........

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

        rootView.findViewById(R.id.bugttracker_layout).setVisibility(ViewGroup.INVISIBLE);

        return rootView;

    }

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        ..........
        ..........
    }

    @SuppressLint("JavascriptInterface")
    public class myWebAppInterface {
        Context mContext;

        myWebAppInterface(Context c) {
            mContext = c;
        }

        @JavascriptInterface
        public void getValue(String val){
            sentToActivity(val);
        }
    }

    public void sentToActivity(String val) {
        Toast.makeText(getActivity(), "Click", Toast.LENGTH_SHORT).show();
        getFragmentManager().popBackStack();
        getActivity().onBackPressed();
        ((MainActivity) getActivity()).getFragmentValue(val);

    }

}   

С обычным onBackPressed,все работает нормально, однако, как только я пытаюсь вызвать «назад» программно с помощью sentToActivity (), я больше не могу найти пункт в меню и изменить его.

Хотя, если sentToActivity зависает довыполните щелчок кнопкой во фрагменте из слушателя, тогда все в порядке.

Скажите, где моя ошибка? Почему именно вызов функции из @Javascriptinterface при возврате к основному действию лишает доступа к элементам меню навигации?

...