一次实验的经历
一次实验时,为了实现使用WebView来加载URL,并且需要在跳转之后,出现选择项,选择自定义的MyBrowser进行浏览,于是编写了如下代码:
public class MainActivity extends AppCompatActivity {
private String urlHead="https://";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button1=(Button)findViewById(R.id.button);
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
EditText edit1=(EditText)findViewById(R.id.editText);
String url=edit1.getText().toString();
if(url.isEmpty()){
edit1.setError("请输入网址");
}
else {
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse(urlHead+url));
startActivity(intent);
}
}
});
}
}
webview的代码如下:
public class MainActivity extends AppCompatActivity{
private String uriHome = "http://www.baidu.com";
private String url;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
WebView webView = (WebView) findViewById(R.id.webview);
webView.getSettings().setJavaScriptEnabled(true);
webView.setWebViewClient(new WebViewClient(){
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
});
Intent intent = getIntent();
Uri data = intent.getData();
if (data == null) {
url = "http://www.baidu.com";
data = Uri.parse(url);
}
webView.loadUrl(data.toString());
}
}
但是结果发现,无论如何都无法实现在跳转之后,出现选择项来选择使用哪个浏览器来打开网页。于是便去翻阅各种资料,可是却发现我的代码没有任何问题,终于在一行一行进行审查时,发现了问题所在:
import androidx.appcompat.app.AppCompatActivity;
我引入的是Google最新推出的androidx,而非传统的android.support包
import android.support.v7.app.AppCompatActivity;
改成引用android.support包后,项目便可以正常弹出浏览器的选择项。
为什么会引入androidx包
我所使用的是3.4.1版本的Android Studio,在创建项目时,会有如下选择项:
如果勾选,项目便会自动引入androidx包
androidx和android.support有何区别
按照官方文档的说明 ,androidx 是对android.support包的整理后产物。未来新的特性和改进都会进入androidx包。主要原因是support库的命名十分混乱。所以,google推出了 androidx。但是现在的稳定版本还是采用android.support。
android.support | androidx |
---|---|
com.android.support:support-compat | androidx.core:core:1.0.0+ |
com.android.support:appcompat-v7 | androidx.appcompat:appcompat:1.0.0+ |
com.android.support:design | com.google.android.material:material:1.0.0+ |
com.android.support:multidex | androidx.multidex:multidex:2.0.0+ |
com.android.support:recyclerview-v7 | androidx.legacy:legacy-support-v4:1.0.0+ |
com.android.support:viewpager | androidx.viewpager:viewpager:1.0.0+ |
以上是一些常用依赖库的变化,可以看到androidx的包名对于android.support来说,确实精简了不少,而且androidx也将一些UI组件分离出来,例如coordinatorlayout
,viewpager
等等,这样做可以更加精确的定位需要使用的组件,职责更加分明,也可以减轻应用程序运行时的压力。
迁移
如果想要从android.support迁移到androidx,Android Studio有提供一键迁移功能:
还需要手动配置gradle.properties,添加如下代码:
android.enableJetifier=true
android.useAndroidX=true
又或者是在创建项目时直接勾选上文所提到的选项:
为何androidx无法弹出选择项
回到最初的问题,为什么使用androidx时无法弹出浏览器选择项呢?
官方在开发指南有提到目前androidx还存在不稳定的情况,这可能是androidx存在的一个bug。
而且不止是我遇到的这个问题,目前用androidx使用一些控件也会有bug,比如Android的控件RecyclerView就会出现无法下拉列表的bug,所以我推荐大家目前还是使用比较稳定的旧版支持库。