导航抽屉上的MenuItem不响应

时间:2020-01-27 18:39:35

标签: java android

我是Java编程的新手,现在我正在开发一个简单的应用程序,该应用程序集成了可打开特定网站的Web视图。 我的风格是该应用程序的导航抽屉。当我从抽屉菜单中按一个项目时,它根本不起作用。我正在尝试使用webview打开URL,但是什么也没有发生。 我已经尝试了很多在这里找到的东西,但没有得到任何结果

package com.virsoft.alfagreece;

import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;

import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.android.material.snackbar.Snackbar;

import android.view.Gravity;
import android.view.MenuItem;
import android.view.View;

import androidx.annotation.NonNull;
import androidx.core.view.GravityCompat;
import androidx.navigation.NavController;
import androidx.navigation.Navigation;
import androidx.navigation.ui.AppBarConfiguration;
import androidx.navigation.ui.NavigationUI;

import com.google.android.material.navigation.NavigationView;
import com.virsoft.alfagreece.ui.home.HomeFragment;

import androidx.drawerlayout.widget.DrawerLayout;

import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;

import android.view.Menu;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity implements
        NavigationView.OnNavigationItemSelectedListener{

    private NavigationView navigationView;
    private DrawerLayout drawerLayout;

    private WebView myWebView;



    private AppBarConfiguration mAppBarConfiguration;
    @Override        
super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent Email = new Intent(Intent.ACTION_SEND);
                Email.setType("text/email");
                Email.putExtra(Intent.EXTRA_EMAIL,
                        new String[]{"sales@test.com"});
                Email.putExtra(Intent.EXTRA_SUBJECT,
                        "testApp"); // Email 's Subject
                Email.putExtra(Intent.EXTRA_TEXT, "Hi test," + "");  //Email 's Greeting text
                startActivity(Intent.createChooser(Email, "Send message"));
            }
        });


        DrawerLayout drawer = findViewById(R.id.drawer_layout);
        NavigationView navigationView = findViewById(R.id.nav_view);
        myWebView =(WebView) findViewById(R.id.webView);
        WebSettings webSettings=myWebView.getSettings();
        myWebView.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);
        webSettings.setJavaScriptEnabled(true);
        webSettings.setAllowContentAccess(true);
        webSettings.setAppCacheEnabled(true);
        webSettings.setCacheMode(webSettings.LOAD_CACHE_ELSE_NETWORK);
        webSettings.setDomStorageEnabled(true);
        webSettings.setUseWideViewPort(true);
        webSettings.setSavePassword(true);
        webSettings.setSaveFormData(true);
        webSettings.setEnableSmoothTransition(true);
        DrawerLayout drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
        myWebView.setWebViewClient(new WebViewClient());
        myWebView.loadUrl("https://www.test.com");
        // Passing each menu ID as a set of Ids because each
        // menu should be considered as top level destinations.
        mAppBarConfiguration = new AppBarConfiguration.Builder(
                R.id.nav_home)
                .setDrawerLayout(drawer)
                .build();
        NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
        NavigationUI.setupActionBarWithNavController(this, navController, mAppBarConfiguration);
        NavigationUI.setupWithNavController(navigationView, navController);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onSupportNavigateUp() {
        NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
        return NavigationUI.navigateUp(navController, mAppBarConfiguration)
                || super.onSupportNavigateUp();
    }

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

        if (id == R.id.nav_home) {
            myWebView.loadUrl("https://youtube.com");
            Toast.makeText(MainActivity.this,"testing", Toast.LENGTH_LONG).show();

            return true;
        }

        else if (id == R.id.nav_gallery) {

            myWebView.loadUrl("https://yahoo.com");

            return true;
        }

        return true;
    }

    @Override
    public void onBackPressed() {
        if(myWebView.canGoBack()) {
            myWebView.goBack();
        } else {
            super.onBackPressed();
        }
    }
}

1 个答案:

答案 0 :(得分:1)

在设置了一个小样本并进行了一些调试之后,在我看来NavigationView可以通过使用NavController设置导航或设置NavigationView.OnNavigationItemSelectedListener来控制。您不能同时拥有它们。

因此,如果您想继续使用导航组件(应该可以使用),那么问题是如何通知NavigationView项目的点击?

NavController将导航到某个目的地,仅此而已。但是使用safeargs plugin,可以将参数值传递到目标Fragment

如果您始终使用相同的目的地(Fragment)但使用不同的URL,则可以将每个NavigationView项与导航图中的特定action关联,而后者又属于一个特定网址。

在我的示例应用程序中,NavController用新的HomeFragment实例替换了已经可见的HomeFragment,并且新的URL正确传递了。

MainActivity onCreate()(请注意,您可以从NavigationView.OnNavigationItemSelectedListener中删除与MainActivity相关的所有内容):

private AppBarConfiguration mAppBarConfiguration;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Toolbar toolbar = findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    DrawerLayout drawer = findViewById(R.id.drawer_layout);
    NavigationView navigationView = findViewById(R.id.nav_view);

    // Passing each menu ID as a set of Ids because each
    // menu should be considered as top level destinations.
    mAppBarConfiguration = new AppBarConfiguration.Builder(R.id.nav_home)
            .setDrawerLayout(drawer)
            .build();
    NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
    NavigationUI.setupActionBarWithNavController(this, navController, mAppBarConfiguration);
    NavigationUI.setupWithNavController(navigationView, navController);
}

导航图中参数的基本声明:

<fragment
    android:id="@+id/nav_home"
    android:name="com.example.navdrawerissue.HomeFragment"
    android:label="fragment_home"
    tools:layout="@layout/fragment_home">
    <argument
        android:name="webUrl"
        app:argType="string"
        android:defaultValue="https://developer.android.com"/>
</fragment>

在导航图中声明全局action(在fragment下,不嵌套!)

<action android:id="@+id/nav_other" app:destination="@+id/nav_home">
    <argument
        android:name="webUrl"
        app:argType="string"
        android:defaultValue="https://youtube.com" />
</action>

NavigationView菜单

<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/nav_home"
        android:icon="@drawable/ic_launcher_background"
        android:title="nav_home"/>
    <item android:id="@+id/nav_plusone"

        android:title="plus one"/>
    <item android:id="@+id/nav_other"

        android:title="other"/>
</menu>