我是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();
}
}
}
答案 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>