2017-10-13 11 views
0

Je suis un débutant dans le développement android, en fait j'ai un fragment avec webview. Mon problème est quand je suis dans le fragment et cliquez sur le bouton de retour il ne revient pas à la page Web précédente à la place, il revient au fragment précédent. alors s'il vous plaît aidez-moi à résoudre ce problème.sur le bouton de retour pressé webview fragment est le film au fragment précédent au lieu de la page Web précédente

Voici mon code d'activité principal:

public class MainActivity extends AbsRuntimePermission implements NavigationView.OnNavigationItemSelectedListener { 
    //, GoogleApiClient.OnConnectionFailedListener { 

    private static final int REQUEST_PERMISSION = 10; 
    private Toolbar toolBar; 
    private NavigationView navDrawer; 
    private DrawerLayout drawerLayout; 
    private ActionBarDrawerToggle drawerToggle; 
    private FirebaseAuth.AuthStateListener authListener; 
    private FirebaseAuth auth; 
    private View btnLogOut; 
    private int selectedItem; 
    private FirebaseDatabase mFirebaseDatabase; 
    private DatabaseReference myRef; 
    // private GoogleApiClient googleApiClient; 
    private FloatingActionButton fab; 
    private CoordinatorLayout coordinatorLayout; 
    private HomeFragment homeFragment=new HomeFragment(); 

    final String TAG = this.getClass().getName(); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     coordinatorLayout = (CoordinatorLayout) findViewById(R.id.coordinatorLayout); 
     auth = FirebaseAuth.getInstance(); 
     final FirebaseUser user = auth.getCurrentUser(); 
     String userID = user.getUid(); 
     // Check if no view has focus: 
     View view = this.getCurrentFocus(); 
     if (view != null) { 
      InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
      imm.hideSoftInputFromWindow(view.getWindowToken(), 0); 
     } 
     fab = (FloatingActionButton) findViewById(R.id.fab); 
     fab.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       Intent intent = new Intent(MainActivity.this, Contact_FAB.class); 
       startActivity(intent); 
      } 
     }); 
     FragmentTransaction tx = getSupportFragmentManager().beginTransaction(); 
     tx.replace(R.id.main_content, homeFragment); 
     tx.commit(); 
     final WebView webView = (WebView) findViewById(R.id.WV); 
     WebSettings webSettings = webView.getSettings(); 
     webSettings.setJavaScriptEnabled(true); 
     webView.setWebViewClient(new WebViewClient() { 
      public void onPageStarted(WebView view, String url, Bitmap favicon) { 
      } 

      public void onPageFinished(WebView view, String url) { 
       // do your stuff here} 
       @Override 
       public void onReceivedError (WebView view,int errorCode, String description, String 
       failingUrl){ 
        super.onReceivedError(view, errorCode, description, failingUrl); 
       } 
      }); 

    webView.loadUrl("https://google.co.in"); 

      requestAppPermissions(new String[] { 
       Manifest.permission.READ_CONTACTS, 
         Manifest.permission.READ_EXTERNAL_STORAGE, 
         Manifest.permission.WRITE_EXTERNAL_STORAGE 
      }, 
      R.string.msg,REQUEST_PERMISSION); 

      toolBar =(Toolbar) 

      findViewById(R.id.app_bar); 

      setSupportActionBar(toolBar); 

      // If a notification message is tapped, any data accompanying the notification 
      // message is available in the intent extras. In this project the launcher 
      // intent is fired when the notification is tapped, so any accompanying data would 
      // be handled here. If you want a different intent fired, set the click_action 
      // field of the notification message to the desired intent. The launcher intent 
      // is used when no click_action is specified. 
      // 
      // Handle possible data accompanying notification message. 
    if(

      getIntent(). 

      getExtras() !=null) 

      { 
       for (String key : getIntent().getExtras().keySet()) { 
        String value = getIntent().getExtras().getString(key); 
        if (key.equals("AnotherActivity") && value.equals("True")) { 
         Intent intent = new Intent(this, AnotherActivity.class); 
         intent.putExtra("value", value); 
         startActivity(intent); 
         finish(); 
        } 

       } 
      } 

      // subscribeToPushService(); 

      drawerLayout =(DrawerLayout) 

      findViewById(R.id.drawer_layout); 

      navDrawer =(NavigationView) 

      findViewById(R.id.menu_drawer); 
    navDrawer.setNavigationItemSelectedListener(this); 
      drawerToggle =new 

      ActionBarDrawerToggle(this,drawerLayout, toolBar, R.string.drawer_open, R.string.drawer_close); 
    drawerLayout.setDrawerListener(drawerToggle); 
    drawerToggle.syncState(); 
      selectedItem =savedInstanceState ==null?R.id.nav_item_1 :savedInstanceState.getInt("selectedItem"); 

     } 


     @Override 
     public boolean onNavigationItemSelected (MenuItem menuItem){ 
      menuItem.setChecked(true); 
      selectedItem = menuItem.getItemId(); 
      Fragment fragment = null; 
      switch (selectedItem) { 
       case R.id.nav_item_1: 
        fragment = new HomeFragment(); 
        break; 
       case R.id.nav_item_2: 
        fragment = new MicrosoftDskFragment(); 
        break; 
       case R.id.nav_item_3: 
        fragment = new GoogleDskFragment(); 
        break; 
       case R.id.nav_item_4: 
        fragment = new AppleDskFragment(); 
        break; 
       case R.id.nav_item_5: 
        fragment = new OthersDskFragment(); 
        break; 
       case R.id.nav_item_6: 
        fragment = new MobiSpecsFragment(); 
        break; 
       case R.id.nav_item_8: 
        Intent intent = new Intent(MainActivity.this, About.class); 
        startActivity(intent); 
        break; 
       default: 
        break; 
      } 

      if (!DetectConnection.checkInternetConnection(MainActivity.this)) { 
       Toast.makeText(MainActivity.this, "Plz check your network connectivity", Toast.LENGTH_SHORT).show(); 
      } else { 

       if (fragment != null) { 

        FragmentManager fragmentManager = getSupportFragmentManager(); 
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
        fragmentTransaction.replace(R.id.main_content, fragment); 
        fragmentTransaction.addToBackStack(null); 
        fragmentTransaction.commit(); 
       } 
      } 

      drawerLayout.closeDrawer(GravityCompat.START); 
      return true; 
     } 

     boolean twice = false; 

     @Override 
     public void onBackPressed() { 
      DrawerLayout layout = (DrawerLayout) findViewById(R.id.drawer_layout); 

      if (layout.isDrawerOpen(GravityCompat.START)) { 
       layout.closeDrawer(GravityCompat.START); 
      } else { 
       if (getSupportFragmentManager().getBackStackEntryCount() > 0) { 
        getSupportFragmentManager().popBackStack(); 
       } else { 
        Log.d(TAG, "click"); 

        if (twice == true) { 
         Intent intent = new Intent(Intent.ACTION_MAIN); 
         intent.addCategory(Intent.CATEGORY_HOME); 
         intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
         startActivity(intent); 
         finish(); 
         System.exit(0); 
        } 
        twice = true; 
        Log.d(TAG, "twice: " + twice); 

        //super.onBackPressed(); 
        Toast.makeText(MainActivity.this, "Please Press Again To Exit", Toast.LENGTH_SHORT).show(); 

        new Handler().postDelayed(new Runnable() { 
         @Override 
         public void run() { 
          twice = false; 
          Log.d(TAG, "twice: " + twice); 
         } 
        }, 3000); 

       } 
      } 
     } 

     @Override 
     public boolean onKeyDown (int keyCode, KeyEvent event){ 
      if (event.getAction() == KeyEvent.ACTION_DOWN) { 
       switch (keyCode) { 
        case KeyEvent.KEYCODE_BACK: 
         homeFragment.OnKeyDown(keyCode); 
         return true; 
       } 
      } 
      return super.onKeyDown(keyCode, event); 
     } 


     @Override 
     public boolean onCreateOptionsMenu (Menu menu){ 
      // Inflate the menu; this adds items to the action bar if it is present. 

      getMenuInflater().inflate(R.menu.menu_main, menu); 

      return super.onCreateOptionsMenu(menu); 
     } 

     @Override 
     public boolean onOptionsItemSelected (MenuItem item){ 
      // Handle action bar item clicks here. The action bar will 
      // automatically handle clicks on the Home/Up button, so long 
      // as you specify a parent activity in AndroidManifest.xml. 
      int id = item.getItemId(); 


      //noinspection SimplifiableIfStatement 
      if (id == R.id.profile) { 
       Intent intent = new Intent(MainActivity.this, Profile.class); 
       startActivity(intent); 
       return true; 
      } 


      return super.onOptionsItemSelected(item); 
     } 


     @Override 
     public void onSaveInstanceState (Bundle outState, PersistableBundle outPersistentState){ 
      super.onSaveInstanceState(outState, outPersistentState); 

      outState.putInt("selectedItem", selectedItem); 
     } 

     @Override 
     public void onPermissionsGranted (int requestCode){ 
      //Do anything when permisson granted 
      // Toast.makeText(getApplicationContext(), "Permission granted", Toast.LENGTH_LONG).show(); 
     } 


/* @Override 
    public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { 

    } 

*/ 

    } 
} 

Et voici mon Accueil Fragment de code:

@SuppressWarnings("ALL") 

HomeFragment public class étend Fragment {

WebView webView; 
SwipeRefreshLayout swipeView; 

public HomeFragment() { 
    // Required empty public constructor 
} 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    View rootView = inflater.inflate(R.layout.fragment_home, container, false); 
    swipeView = (SwipeRefreshLayout) rootView.findViewById(R.id.container); 
    webView = (WebView) rootView.findViewById(R.id.webView); 


    webView.getSettings().setJavaScriptEnabled(true); 
    // Inflate the layout for this fragment 
    webView.loadUrl("https://google.co.in"); 

    webView.setWebViewClient(new WebViewClient() { 
     @Override 
     public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { 
      webView.stopLoading(); 
      webView.clearView(); 
      Intent intent = new Intent(getActivity(), ErrorActivity.class); 
      startActivity(intent); 
      swipeView.setEnabled(false); 
      super.onReceivedError(view, errorCode, description, failingUrl); 

     } 

     public void onPageFinished(WebView view, String url) { 
      // do your stuff here 
      swipeView.setRefreshing(false); 

     } 

    }); 


    swipeView.setColorScheme(android.R.color.holo_blue_dark, android.R.color.holo_blue_light); 
    swipeView.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { 

     @Override 
     public void onRefresh() { 
      swipeView.setRefreshing(true); 

      (new Handler()).postDelayed(new Runnable() { 
       @Override 
       public void run() { 
        webView.loadUrl("javascript:window.location.reload(true)"); 

       } 
      }, 2000); 
     } 
    }); 
    return rootView; 
} 
    @Override 
    public void onAttach (Activity activity){ 
     super.onAttach(activity); 
    } 

    @Override 
    public void onDetach() { 
     super.onDetach(); 
    } 

    public void OnKeyDown(int keyCode) { 
    if (webView != null) { 
     if (webView.canGoBack()) { 
      webView.goBack(); 

     } else { 
      getActivity().onBackPressed(); 
     } 
    } 
} 
} 
+0

Essayez d'ajouter quelque chose comme webView.canGoBack() dans onBackPressed() Ref: https://stackoverflow.com/questions/427492 69/back-button-in-android-webview-dans-un-fragment – VVB

Répondre

0

Dans votre onNavigationItemSelected quand le FragmentManager remplace le fragment, ne l'ajoutez pas au backstack:

FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
        fragmentTransaction.replace(R.id.main_content, fragment); 
        fragmentTransaction.commit(); 

Si vous ajoutez à la backstack, cela signifie que vous ajoutez ce fragment à la pile de l'histoire de l'activité, l'action qui est réverté lorsque vous appuyez sur le bouton de retour. Donc, chaque fois que vous ajoutez un nouveau Fragment, la pile sera comme ceci: [fragment1] [fragment2] [fragment3], et si vous appuyez sur le bouton retour, il supprimera la dernière action ajoutée, ainsi la suppression de [fragment3] montrera vous le [fragment2].

Espérons que cela aide.

+0

Thanx va essayer que –

+0

enlever ajouter à la pile arrière ne résout pas mon problème –

0

Créer une méthode dans votre fragment comme pour exécuter cette action lorsque les touches sont pressées

public void OnKeyDown(int keyCode){ 
    if (mWebView.canGoBack()) { 
     mWebView.goBack(); 
    } else { 
     getActivity().onBackPressed(); 
    } 
} 

Et dans votre méthode de substitution keyDown d'activité correspondante et gérer la pression de touche

@Override 
public boolean onKeyDown(int keyCode, KeyEvent event) { 
    if (event.getAction() == KeyEvent.ACTION_DOWN) { 
     switch (keyCode) { 
      case KeyEvent.KEYCODE_BACK: 
       yourFagmentObject.OnKeyDown(keyCode); 
       return true; 
     } 
    } 
    return super.onKeyDown(keyCode, event); 
} 

Retirez le webView.setOnKeyListener (new View.OnKeyListener() from webViewFragment

+0

Thanx va essayer que –

+0

; attendu dans le fragment –

+0

ne peut pas résoudre la méthode OnKeyDown (int) dans l'activité principale –