如何获取网站内容并将其以我们想要的方式放入Android应用程序布局中?

5

这是一个有点奇怪的问题,但好奇心是最好的老师,我渴望知道并开发这种类型的安卓应用程序。

我的背景在安卓应用程序开发方面不是很出色,但现在我正在使用WebView浏览网站,它具有响应式设计,虽然工作良好,但加载时间太长,给用户带来不便。以下是我的代码:

MainActivity

package com.testWebview.deep;

import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.Uri;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;

public class MainActivity extends AppCompatActivity {

    private WebView webview;
    private ProgressDialog progress;

    public void runTask(){
        ConnectivityManager connec = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
        if(connec!=null && (connec.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState() == NetworkInfo.State.CONNECTED) || (connec.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).getState() == NetworkInfo.State.CONNECTED)){
            webview = (WebView)findViewById(R.id.MainWebView);
            WebSettings webSettings = webview.getSettings();
            webSettings.setJavaScriptEnabled(true);
            webSettings.setLoadsImagesAutomatically(true);
            webSettings.setLoadWithOverviewMode(true);
            webSettings.setDomStorageEnabled(true);
            webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
            webSettings.setAllowFileAccess(true);
            webSettings.setBuiltInZoomControls(true);
            webSettings.setUseWideViewPort(true);
            loadingC();
            webview.setWebViewClient(new WebViewClient(){

                @Override
                public void onPageStarted(WebView view, String url,Bitmap favicon){
                    if(!progress.isShowing()){
                        loadingC();
                    }

                }
                @Override
                public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
                    if(progress.isShowing()){progress.dismiss();}
                    checkConnection();
                    webview.loadUrl("file:///android_asset/error.html");
                }

                @Override
                public void onPageFinished(WebView view, String url) {
                    if(progress.isShowing()) {
                        progress.dismiss();
                    }
                }
            });
            webview.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY);
            webview.setScrollbarFadingEnabled(false);
            webview.setLayerType(View.LAYER_TYPE_HARDWARE, null);
            webview.loadUrl("http://www.bharatcoupons.com/");
        }
        else{
            checkConnection();
        }
    }

    public void checkConnection(){
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle("Error");
        builder.setMessage("Please make sure your connected to internet!");
        builder.setCancelable(false);
        builder.setPositiveButton("retry", new DialogInterface.OnClickListener() {

            public void onClick(DialogInterface dialog, int which) {
                runTask();
            }

        });
        builder.show();
    }

    public void loadingC(){
        progress = ProgressDialog.show(this, "Loading", "Please wait for a moment...");
    }

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

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

    @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 true;
    }

    @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.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

    private class MyAppWebViewClient extends WebViewClient{

    }
}

MyAppWebViewClient

package com.testWebview.deep;

import android.content.Intent;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.net.Uri;

public class MyAppWebViewClient extends WebViewClient{

    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url){
        if(Uri.parse(url).getHost().endsWith("bharatcoupons.com")){
            return false;
        }
        Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
        view.getContext().startActivity(intent);
        return true;
    }

}

以上代码在webview中运行良好,但它是一种开发Android应用程序的缓慢且不专业的方式。现在我想做的是获取网站内容并将其放入我想要的应用程序框架中。我将向您展示一个示例,它将详细说明我想要做的所有事情。
假设我的网站是这样的: An website 我应该采取什么样的方法或技巧来使我的应用程序如下所示: enter image description here 据我所知,这不是直接在应用程序中显示网站内容的Webview。在左右交换时,它将向您显示下一个项目。整个网站都在此应用程序中,但不使用WebView。
他们制作了这样的框架,可以从网站中获取内容并将其放入应用程序中。我也想这样做。
我不需要代码,但我应该从哪里开始?我应该使用什么样的方法或技术来实现这一点。
参考网站和应用仅供教育目的,没有其他意图。谢谢!

你应该首先在你的网站上使用响应式设计,这样在普通浏览器中查看它时会产生你想要的布局。 - chrylis -cautiouslyoptimistic-
我相信Flipkart使用了Webview和本地元素的组合。 - harshitpthk
我建议您查看 Jsoup,它可以用于解析 DOM,然后您可以使用通过 Jsoup 解析的数据构建本地应用程序。许多在 Play Store 上的应用程序都使用它,这是一个相当强大的库。参考链接:http://jsoup.org 教程链接:https://www.youtube.com/watch?v=E_tRyVzKY2s - Piyush-Ask Any Difference
3个回答

5

方法一:

使用响应式网站,可以自动适应移动设备/平板电脑屏幕。

方法二:

解析像图像和文本这样的网页文档,然后在ImageView或其他UI内容中显示它。

对于HTML解析,您可以使用第三方库,如JSOUP

最佳方法:

现在几乎所有公司/在线服务都使用API在Web和其他平台之间进行通信。它保持所有数据对齐和灵活性,因为所有信息都来自同一源。为您的Web服务创建一个RESTful API。调用API并以JSON格式获取数据。稍后解析信息并在视图中显示它。

例如,要获取特定产品的信息,

http://your_address/shopping/v1/get_product_info

enter image description here

JSON格式的结果可能是这样的,

{
    "error": false,
    "name": "ETC Solid Men's Polo Neck -Tshirt",
    "description": "Your pruduct description",
    "images": [
        {
            "preview1": "http://yoururl.com/images/preview1"
        },
        {
            "preview2": "http://yoururl.com/images/preview2"
        },
        {
            "preview3": "http://yoururl.com/images/preview3"
        },
        {
            "preview4": "http://yoururl.com/images/preview4"
        }
    ]
}

0
一个好的时间/工作/结果方法是在一个简单的 Cordova 应用程序中“包装”您的网站。因此,您应该开始 学习 Cordova,然后为移动世界在您的网站上添加响应式/自定义 CSS 代码(如果尚不存在),然后修复在手机上不正确工作的所有内容(JS/CSS)。

0
如果这个网站有一个API,你可以通过API来实现。如果它有JSON数据,你可以通过JSON连接。在最坏的情况下,你可以将其HTML解析为XML或JSON,或直接转换为所需的数据对象。
这种方法不太推荐的原因是,如果他们更改了站点中的某些内容,可能会立即破坏你的界面。
大型网站通常都有API检查: 亚马逊API Facebook API Soundcloud API
等等。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接