我正在做一个计算器应用程序,想更新第二个片段中的历史,但无法找到一个完美的解决方案更新第二个片段中的listview。我试过许多解决办法,但都不管用。我用viewpager在计算器和历史片段之间滑动。我厌倦了bundle类,但如果我在第一个片段(calculatorfragment)的oncreat方法中使用bundle和viewpager,它会在启动应用程序后显示一个空白屏幕&如果我在equal button中使用bundle类,它会使应用程序崩溃。这里我传递viewpager的id作为片段的容器。
我看到许多答案完美地工作时,他们正在使用framelayout为容器的碎片,但我想保持滑动功能的viewpager,我尝试了许多解决方案,但没有他们与viewpger正常工作,我添加了SharedReferences到我的代码,但它是不更新(不是活的),当我使用计算器。SharedReferences似乎可以工作,但当应用程序运行时,它们不会更新历史记录,当我重新启动应用程序时,它会显示我在历史片段中的最后一次计算。
我传递了sharedpreferences并在onresume/onstart方法的第二个片段(history fragment)中获取字符串,但它只在我关闭应用程序时显示上次计算的历史
我正在使用自定义arraylist在历史片段中存储和显示我的历史输出。
每当有人单击应用程序中的“=”按钮时,我想将数据(计算以显示历史)传递给historyfragment按钮调用计算器应用程序中的相等方法。
发生了什么的例子如果我在我的计算器里做这个计算,它不会更新
在历史上,它显示了我关闭应用程序时的最后一个
以下是我迄今为止所做的
它是使用SharedReferences将答案保存在calculatorfragment.java(第一个片段)中的代码
我也不知道该用哪一个.appy()还是.commit()
public View onCreatView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_calculator, container, false);
SharedPreferences mPreferences = PreferenceManager.getDefaultSharedPreferences(getContext());
SharedPreferences.Editor mEditor = mPreferences.edit();
/*
other code
*/
public void Equals() {
String calc = etCalc.getText().toString();
if (calc.split("\\+").length == 2) {
String[] calculation = calc.split("\\+");
String Ans = String.valueOf(Double.parseDouble(calculation[0]) +
Double.parseDouble(calculation[1]));
etCalc.setText(Ans);
tvCalc.setText(calc);
mEditor.putString("key",calc+"="+Ans);
mEditor.apply();
}
}
历史片段.java
import android.content.SharedPreferences;
import android.os.Bundle;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import android.preference.PreferenceManager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListView;
import java.util.ArrayList;
public class HistoryFragment extends Fragment {
ArrayList<HistoryList> historyLists;
SharedPreferences mPreferences;
String History = "";
View rootView;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
rootView = inflater.inflate(R.layout.fragment_history, container, false);
return rootView;
}
public void onResume(){
super.onResume();
SharedPreferences mPreferences = PreferenceManager.getDefaultSharedPreferences(getContext());
History = mPreferences.getString("key", "");
if (History.split("=").length == 2) {
historyLists = new ArrayList<>();
historyLists.add(new HistoryList(History.split("=")[0], History.split("=")[1]));
}
HistoryAdapter adapter = new HistoryAdapter(getActivity(), historyLists);
ListView listView = rootView.findViewById(R.id.history);
listView.setAdapter(adapter);
}
}
主活动.java
import androidx.annotation.RequiresApi;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import androidx.viewpager.widget.ViewPager;
import android.annotation.SuppressLint;
import android.os.Build;
import android.os.Bundle;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
ViewPager viewPager;
pageAdapter pageAdapter;
Button btnEqual;
@RequiresApi(api = Build.VERSION_CODES.M)
@SuppressLint({"SetTextI18n", "UseCompatLoadingForDrawables"})
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
viewPager = findViewById(R.id.viewPager);
//Get rid of ActionBar
ActionBar actionBar = getSupportActionBar();
assert actionBar != null;
actionBar.hide();
pageAdapter = new pageAdapter(getSupportFragmentManager(), 2);
viewPager.setAdapter(pageAdapter);
}
}
活动\u main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<androidx.viewpager.widget.ViewPager
android:id="@+id/viewPager"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
如果您需要任何其他应用程序代码,请进行注解。
1条答案
按热度按时间nfeuvbwi1#
我找到了这个问题的解决办法。我们可以使用sharedviewmodel通过片段传递数据,而不需要使用sharedpreferences。我们可以将文本设置为viewmodel并在第二个片段中获取它,即使两个片段都处于恢复状态(都处于恢复状态,因为这里我们使用的是简单的viewpager)。
我把我的代码贴在下面作为参考,我是如何更新第二个片段中的数据的。
在mainactivity.java文件中添加此代码。添加两个片段是必要的,如果只添加任何一个片段,则不会产生viewpager的幻灯片效果。
将文本设置为calculatorfragment.java文件中的viewmodel。
创建一个名为sharedviewmodel.java的类
最后在second historyfragment.java中从viewmodel中获取数据