首页 > 解决方案 > 仅在添加一个时才在 LinearLayout 中动态创建 WebView 和 TextView

问题描述

我正在尝试在滚动视图(如新闻提要)内的线性视图中动态创建 Web 视图和文本区域。不确定这是否是最好的方法,但基本上我想动态加载 json 项目并在新闻提要中呈现。当我的代码运行时,它只呈现一个项目,我不确定它为什么不全部创建它们。

我正在学习 android,试图弄清楚如何动态检索和显示本质上是墙提要的数据。

当我尝试在滚动视图内部的线性视图内创建 web 视图或文本视图时遇到问题,它要么在循环时覆盖现有对象,要么所有内容都位于其自身之上。老实说,我不太确定,我对 android 开发非常熟悉。

概括:

问题 1:此代码不会创建动态元素并将它们堆叠在滚动视图中,因此我可以滚动它们。问题 2:如何为每个项目设置默认大小,以便它们在滚动视图中具有相同的大小?问题 3:我使用的模拟设备无法访问互联网。我正在使用代理将我的 PC 循环回正在运行的返回 json 字符串的本地 api。当它们是链接时,它无法加载 youtube 嵌入,我也无法在浏览器中加载。

任何帮助表示赞赏。

示例 json

{
  "4006": {
    "owner": "freedomhard", 
    "post_data": "Cheers.", 
    "time": 1570588719
  }, 
  "4009": {
    "owner": "Kcreichen", 
    "post_data": "Good night 😊", 
    "time": 1570589506
  }, 
  "4011": {
    "owner": "Jpowers40828", 
    "post_data": "Instead people revere them as celebrities and impressive.", 
    "time": 1570590300
  }, 
  "4024": {
    "owner": "NorthernMich", 
    "post_data": "https://www.youtube.com/embed/R6E1H82DqHE", 
    "time": 1570593697
  }, 
  "4027": {
    "owner": "DvlDog17", 
    "post_data": "🤘🤘\r\n\r\nhttps://youtu.be/ptro0vwRMaA", 
    "time": 1570595894
  }, 
  "4037": {
    "owner": "617Dan", 
    "post_data": "https://www.facebook.com/1230804746996245/posts/2530952203648153?sfns=mo\r\n\r\n\r\nCame across this little bit this morning, sums it up quite nicely", 
    "time": 1570617231
  }, 
  "4045": {
    "owner": "billyd1431", 
    "post_data": "https://www.lovedreamer.com/Sophia-Rossi-Big-Boob-Doll", 
    "time": 1570625995
  }, 
  "4047": {
    "owner": "txangelnjs", 
    "post_data": "Good morning y'all!!", 
    "time": 1570626060
  }, 
  "4048": {
    "owner": "freedomhard", 
    "post_data": "Hello you sexy mother fuckers.", 
    "time": 1570626409
  }, 
  "4052": {
    "owner": "Jpowers40828", 
    "post_data": "It\ufffds because he\ufffds not a conservative, he\ufffds a liberal who doesn\ufffdt respect the 2nd amendment and loves social programs (look at bailout programs). \r\nhttps://www.newsweek.com/trump-deficit-debt-cbo-data-obama-1463802", 
    "time": 1570628450
  }, 
  "4053": {
    "owner": "Otterbox92", 
    "post_data": "Celebrating three years sober from alcohol today! 🙂 looking back, I\ufffdm thankful and blessed that I got that DUI. It completely changed me and I haven\ufffdt had a sip since that night.", 
    "time": 1570628462
  }
}

content_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    tools:context=".MainActivity"
    tools:showIn="@layout/activity_main">

    <ScrollView
        android:id="@+id/news_update"
        android:layout_width="409dp"
        android:layout_height="673dp"
        android:layout_marginEnd="1dp"
        android:layout_marginRight="1dp"
        android:layout_marginBottom="8dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent">

        <LinearLayout
            android:id="@+id/content_view"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:layout_marginBottom="60dp">


        </LinearLayout>


    </ScrollView>



</androidx.constraintlayout.widget.ConstraintLayout>

MainActivity.java

package com.example.freedomhard_test;

import android.os.Bundle;

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

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

import android.view.View;
import android.view.Menu;
import android.view.MenuItem;

import android.os.Bundle;
import java.io.IOException;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import android.util.Log;
import android.widget.TextView;

import org.json.JSONObject.*;
import org.json.JSONObject;
import org.json.JSONException;
import java.util.Iterator;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.view.ViewGroup.LayoutParams;
import android.util.Base64;

public class MainActivity extends AppCompatActivity {
    TextView newtext;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);


        OkHttpClient client = new OkHttpClient();

        setContentView(R.layout.activity_main);
        String url = "http://10.0.2.3";

        Request request = new Request.Builder()
                .url(url)
                .build();

        client.newCall(request).enqueue(new Callback() {
            public void onFailure(Call call, IOException e) {
                final String stack_trace = e.toString();
                TextView newtextz = (TextView) findViewById(R.id.content);
                newtextz.setText(stack_trace);
                e.printStackTrace();
            }

            public void onResponse(Call call, Response response) throws IOException {
                if (response.isSuccessful()) {
                    final String myResponse = response.body().string();
                    MainActivity.this.runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            LinearLayout relativeLayout = (LinearLayout) findViewById(R.id.content_view);
                            LayoutParams lparams = new LayoutParams(
                                    LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);

                            JSONObject mainObject = new JSONObject();
                            try {
                                mainObject = new JSONObject(myResponse);
                                System.out.println(mainObject);

                            } catch (JSONException e) {
                                //some exception handler code.
                            }finally {
                                if(mainObject != null){
                                    Iterator<String> iter = mainObject.keys();
                                    while (iter.hasNext()) {
                                        String key = iter.next();
                                        try {
                                            JSONObject value = mainObject.getJSONObject(key);
                                            String post_data = value.getString("post_data");
                                            String user = value.getString("owner");
                                            String time = value.getString("time");
                                            String new_text = "\n" + user + " - " + post_data + " - " + time;
                                            if(post_data.contains("youtube")){

                                                TextView newTxt = new TextView(MainActivity.this);
                                                newTxt.setText(new_text);
                                                relativeLayout.addView(newTxt);

                                                WebView webView = new WebView(MainActivity.this);
                                                webView.setWebViewClient(new WebViewClient());

                                                String unencodedHtml =
                                                        "<iframe width='560' height='315' src='https://www.youtube.com/embed/GAdGmJxfcf8' frameborder='0' allow='accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture' allowfullscreen></iframe>";
                                                String encodedHtml = Base64.encodeToString(unencodedHtml.getBytes(),
                                                        Base64.NO_PADDING);
                                                webView.loadData(encodedHtml, "text/html", "base64");
                                                webView.setLayoutParams(lparams);
                                                relativeLayout.addView(webView);
                                            }else{
                                                TextView newTxt = new TextView(MainActivity.this);

                                                newTxt.setLayoutParams(lparams);
                                                newTxt.setText(new_text);
                                            }

                                            //newtext.setText(new_text);

                                        } catch (JSONException e) {
                                            // Something went wrong!
                                        }
                                    }
                                }
                            }
                        }
                    });
                }
            }



        });

    }

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

标签: javaandroidandroid-layout

解决方案


第一:你应该使用 RecyclerView 来代替创建这个视图。

现在,如果你真的想以这种方式以编程方式创建视图,那么你应该做这样的事情。

WebView wv = new WebView(context);
TextView tv = new TextView(context);

LinearLayout.LayoutParams params = new 
LinearLayout.LayoutParams(ViewWidth,ViewHight);
params./*add required params here*/;
wv.setLayoutParams(params);
tv.setLayoutParams(params);


/*you should take care of hierarchy adding view depending on your layout 
orientation*/
YourLinearLayoutToAddView.addView(wv);
YourLinearLayoutToAddView.addView(tv);

推荐阅读