【问题标题】:TextView not retaining the value I give itTextView 没有保留我给它的值
【发布时间】:2016-06-23 09:38:21
【问题描述】:

在我的应用程序中,我从 php 脚本中获取 JSON 数据。当我获取数据时,我的 Fragment 中有一个 onClick() 方法,它将 TextView 更改为解析后的 JSON。

但是,当我滑动到不同的片段(这是一个滑动/选项卡式活动)时,我的 TextView 不会保留我给它的值,它会更改为原始值。

我希望它保留价值。

MainActivity.java(我认为这不重要)

package me.anshsehgal.lunchmenu;

import android.content.Intent;
import android.support.v4.app.Fragment;
import android.support.design.widget.TabLayout;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.Toolbar;

import android.app.FragmentManager;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.RelativeLayout;

public class MainActivity extends AppCompatActivity {
    String JSON_STRING;
    Toolbar toolbar;
    TabLayout tabLayout;
    ViewPager viewPager;
    ViewPagerAdapter viewPagerAdapter;  //make all the variables

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

        toolbar = (Toolbar)findViewById(R.id.toolBar);
        setSupportActionBar(toolbar);
        tabLayout = (TabLayout)findViewById(R.id.tabLayout);
        viewPager = (ViewPager)findViewById(R.id.viewPager); //reference them
        viewPagerAdapter = new ViewPagerAdapter(getSupportFragmentManager());
        viewPagerAdapter.addFragments(new HomeFragment(),"Mon");
        viewPagerAdapter.addFragments(new MondayFragment(),"Tue");
        viewPagerAdapter.addFragments(new TuesdayFragment(),"Wed");
        viewPagerAdapter.addFragments(new WednesdayFragment(), "Thu");
        viewPagerAdapter.addFragments(new ThursdayFragment(), "Fri");   //adding fragments to view page adapter


        viewPager.setAdapter(viewPagerAdapter);
        tabLayout.setupWithViewPager(viewPager);

        HomeFragment frag = (HomeFragment)getSupportFragmentManager().findFragmentById(R.id.homeFragment);

    }

HomeFragment.java(这是出错的地方)

package me.anshsehgal.lunchmenu;


import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
import android.widget.RelativeLayout;
import android.widget.Toast;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.lang.Void;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;


/**
 * A simple {@link Fragment} subclass.
 */
public class HomeFragment extends Fragment implements View.OnClickListener {
    String JSON_STRING;
    String  jsonData;
    TextView txt;
    String day;
    String soup;
    String non_veg_main;
    String non_veg_side;
    String veg_main;
    String veg_side;
    String MondayMenu;
    public HomeFragment() {
        // Required empty public constructor
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View view = inflater.inflate(R.layout.fragment_home, container, false);
        txt = (TextView) view.findViewById(R.id.textJSON);
        Button btn = (Button) view.findViewById(R.id.buttonGetJSON);
        btn.setOnClickListener(this);
        new BackgroundTask().execute();


        return view;

    }

    @Override
    public void onClick(View v) {
        MainActivity activity = (MainActivity) getActivity();


        try{
            //JSON parsing
            JSONObject parentObject = new JSONObject(jsonData);
            JSONArray parentArray = parentObject.getJSONArray("server_response");
            JSONObject finalObject = parentArray.getJSONObject(0);

            //JSON data assigning to variables
             day = finalObject.getString("day");
             soup = finalObject.getString("soup");
             non_veg_main = finalObject.getString("non_veg_main");
            non_veg_side = finalObject.getString("non_veg_side");
            veg_main = finalObject.getString("veg_main");
            veg_side = finalObject.getString("veg_side");

        }catch (JSONException e){
            e.printStackTrace();
        }

        MondayMenu = "Soup: "+soup+"\n"+"Non Veg Main: "+non_veg_main+"\n"+"Non Veg Side: "+non_veg_side+"\n"+"Veg Main: "+veg_main+"\n"+"Veg Side: "+veg_side;
        txt.setText(MondayMenu);
    }

    class BackgroundTask extends AsyncTask<Void,Void,String>{


            String json_url;
            @Override
            protected void onPreExecute() {
                json_url="http://192.168.0.12/json_get_data.php";
            }

            @Override
            protected String doInBackground(Void... params) {
                try {
                    URL url = new URL(json_url);
                    HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
                    InputStream inputStream = httpURLConnection.getInputStream();
                    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
                    StringBuilder stringBuilder = new StringBuilder();
                    while ((JSON_STRING = bufferedReader.readLine()) != null) {
                        stringBuilder.append(JSON_STRING + "\n");
                    }
                    bufferedReader.close();
                    inputStream.close();
                    httpURLConnection.disconnect();
                    return stringBuilder.toString().trim();
                } catch (MalformedURLException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                return null;
            }

            @Override
            protected void onProgressUpdate(Void... values) {
                super.onProgressUpdate(values);
            }

            @Override
            protected void onPostExecute(String result) {

                 jsonData = result;

            }
        }
    }

【问题讨论】:

    标签: java android json android-fragments view


    【解决方案1】:

    这是因为每次从一个页面切换到另一个页面时都会调用 getView。因此,正在重新创建 TextView。使用该文本创建一个 ViewHolder,将其设置在 ViewHolder 类的创建者上,这样在重新绘制片段时就不会丢失值。 Official viewHolder tutorial

    【讨论】:

    • 我不明白如何在我的情况下实现这一点,所有教程都是关于 ListViews 的。
    • 在您的片段中,包含一个名为 ViewHolder 的内置类,您可以在其中绑定视图并使用 String var 保存 EditText 值。
    • 真的很抱歉,创建 ViewHolder 类后我迷路了。你能告诉我我的代码应该是什么样子吗?我刚开始使用 Android 开发,这一切都让我很困惑。
    • 尝试在片段中添加String myText;onCreateView(){ txt.setText(myText); } & myText = MondayMenu 当你得到 MondayMenu 值时
    【解决方案2】:

    由于您只想在不同选项卡之间切换时保留片段的状态,因此可以按照以下实现:

    TextView vstup;
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.whatever);
        vstup = (TextView)findViewById(R.id.whatever);
        /* (...) */
    }
    
    @Override
    public void onSaveInstanceState(Bundle state) {
        super.onSaveInstanceState(state);
        state.putCharSequence(App.VSTUP, vstup.getText());
    }
    
    @Override
    public void onRestoreInstanceState(Bundle state) {
        super.onRestoreInstanceState(state);
        vstup.setText(state.getCharSequence(App.VSTUP));
    }
    

    希望这能解决您的问题。

    【讨论】:

    • 这里的App 是什么?我收到一个错误:无法解析符号 App 仅供参考我在我的片段中创建这些 @Override 方法,而不是活动
    • 您可以将 App.VSTUP 视为常量字符串。
    猜你喜欢
    • 2011-07-16
    • 2020-05-09
    • 2021-03-22
    • 1970-01-01
    • 1970-01-01
    • 2019-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多