Java 在android应用程序的“历史记录”选项卡中更新和持久化历史记录
该应用程序在EditText中获取城市名称并搜索天气。该应用程序有三个选项卡(主页、历史记录和关于)。我想存储搜索到的cityname,并在“历史记录”选项卡中将其显示为listview。代码中有一个MainActivity和三个片段。我正在使用SharedReferences存储cityname,但每次打开应用程序列表视图时都是空的。 1.有谁能建议我如何实现这个功能吗? 2.我如何实现一个功能,以便当我在ListView中单击历史记录项时,它会将我带到“搜索”选项卡并显示所单击条目的天气Java 在android应用程序的“历史记录”选项卡中更新和持久化历史记录,java,android,listview,android-fragments,sharedpreferences,Java,Android,Listview,Android Fragments,Sharedpreferences,该应用程序在EditText中获取城市名称并搜索天气。该应用程序有三个选项卡(主页、历史记录和关于)。我想存储搜索到的cityname,并在“历史记录”选项卡中将其显示为listview。代码中有一个MainActivity和三个片段。我正在使用SharedReferences存储cityname,但每次打开应用程序列表视图时都是空的。 1.有谁能建议我如何实现这个功能吗? 2.我如何实现一个功能,以便当我在ListView中单击历史记录项时,它会将我带到“搜索”选项卡并显示所单击条目的天气 M
MainActivity
public class MainActivity extends AppCompatActivity implements Tab1Fragment.Tab1FragmentListener ,Tab2Fragment.Tab2FragmentListener{
private static final String TAG="MainActivity";
private SectionsPageAdapter mySectionPageAdapter;
private ViewPager viewPager;
private DataForTabs dataForTabs;
private Tab1Fragment tab1Fragment;
private Tab2Fragment tab2Fragment;
String input="";
public static SharedPreferences sharedPreferences;
ArrayList<String> arrayList;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d(TAG,"onCreate: Starting.");
tab1Fragment=new Tab1Fragment();
tab2Fragment=new Tab2Fragment();
Log.i(" From 1 to main ", "input");
Log.i(" From 1 to main ", input);
mySectionPageAdapter=new SectionsPageAdapter(getSupportFragmentManager());
//set up the ViewPager with the sections adaptor
viewPager=(ViewPager)findViewById(R.id.container);
setupViewPager(viewPager);
TabLayout tabLayout=(TabLayout)findViewById(R.id.tabs);
tabLayout.setupWithViewPager(viewPager);
sharedPreferences=this.getSharedPreferences("com.utb.iftekhar.cityweatherappsnapshot1", Context.MODE_PRIVATE);
}
public void setupViewPager(ViewPager viewPager){
SectionsPageAdapter adapter=new SectionsPageAdapter(getSupportFragmentManager());
adapter.addFragment(new Tab1Fragment(),"Home");
adapter.addFragment(new Tab2Fragment(),"History");
adapter.addFragment(new Tab3Fragment(),"About");
viewPager.setAdapter(adapter);
}
@Override
public void onInput1Set(String input) {
tab2Fragment.updateEditText(input);
arrayList=new ArrayList<>();
arrayList.add(input);
try {
sharedPreferences.edit().putString("arrayList",ObjectSerializer.serialize(arrayList)).apply();
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void onInput2Sent(String input) {
tab1Fragment.updateEditText(input);
Log.i("from 2 to main", input);
}
}
The Search Tab
public class Tab1Fragment extends Fragment{
private MainActivity mainActivity;
private Button getWeatherButton;
private EditText searchCityByName;
private TextView weatherResultTextView=null;
private DownloadTask downloadTask;
private String weatherResults;
private Tab1FragmentListener tab1FragmentListener;
private String cityNameSearched;
public interface Tab1FragmentListener{
void onInput1Set(String input);
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view=inflater.inflate(R.layout.tab1_frag, container, false);
getWeatherButton=(Button)view.findViewById(R.id.getWeatherButton);
searchCityByName=(EditText)view.findViewById(R.id.searchCityByName);
weatherResultTextView=(TextView)view.findViewById(R.id.weatherResult);
mainActivity=new MainActivity();
getWeatherButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
downloadTask=new DownloadTask(new DownloadTask.AsyncResponse() {
@Override
public void processFinish(String output) {
if(!output.equals("")){
weatherResultTextView.setText(output);
}else{
weatherResultTextView.setText("");
}
}
});
cityNameSearched=searchCityByName.getText().toString().trim();
tab1FragmentListener.onInput1Set(cityNameSearched);
Log.i("CityNameSearched", cityNameSearched);
try {
String encodedCityName= URLEncoder.encode(cityNameSearched,"UTF-8" );
} catch (Exception e) {
e.printStackTrace();
}
downloadTask.execute("https://openweathermap.org/data/2.5/weather?q="+cityNameSearched+"&appid=b6907d289e10d714a6e88b30761fae22");
Log.i("Button Cliked","Clicked");
InputMethodManager mgr=(InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
mgr.hideSoftInputFromWindow(searchCityByName.getWindowToken(), 0);
}
});
return view;
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
if(context instanceof Tab1FragmentListener){
tab1FragmentListener=(Tab1FragmentListener)context;
}else{
throw new RuntimeException(context.toString()+
" must implement Tab1FragmentListener"
);
}
}
@Override
public void onDetach() {
super.onDetach();
tab1FragmentListener=null;
}
public void updateEditText(String newText){
searchCityByName.setText(newText);
}
}
The History tab implemetation
public class Tab2Fragment extends Fragment {
private static final String TAG="Tab2Fragment";
private Button button;
private static final String CITY_NAME_SEARCHED="cityNameSearched";
private List<String> historyList;
private ListView historyListView;
private ArrayAdapter<String> arrayAdapter;
private SharedPreferences sharedPreferences;
private Tab2FragmentListener tab2FragmentListener;
String cityNameSearched="";
MainActivity mainActivity;
public interface Tab2FragmentListener{
void onInput2Sent(String input);
}
public Tab2Fragment(){
Log.i("Tab2Fragmentconstructor","called");
}
@Nullable
@Override
public View onCreateView(final LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view=inflater.inflate(R.layout.tab2_frag, container, false);
historyListView=view.findViewById(R.id.historyList);
try {
sharedPreferences = getActivity().getSharedPreferences("com.utb.iftekhar.cityweatherappsnapshot1", getActivity().MODE_PRIVATE);
historyList=(ArrayList<String>)ObjectSerializer.deserialize(sharedPreferences.getString("arrayList", ObjectSerializer.serialize(new ArrayList<String>())));
arrayAdapter=new ArrayAdapter<String>(getActivity(),android.R.layout.simple_list_item_1,historyList);
historyListView.setAdapter(arrayAdapter);
historyListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
tab2FragmentListener.onInput2Sent(historyList.get(position));
Toast.makeText(getActivity(), historyList.get(position), Toast.LENGTH_SHORT).show();
}
});
}catch (Exception e){
e.printStackTrace();
}
return view;
}
public void updateEditText(String newText){
Log.i("reced from 1 in 2 in 2",newText);
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
if(context instanceof Tab2FragmentListener){
tab2FragmentListener=(Tab2FragmentListener)context;
}else{
throw new RuntimeException(context.toString()+
" must implement Tab2FragmentListener"
);
}
}
@Override
public void onDetach() {
super.onDetach();
tab2FragmentListener=null;
}
}
main活动
公共类MainActivity扩展AppCompatActivity实现Tab1Fragment.Tab1FragmentListener、Tab2Fragment.Tab2FragmentListener{
私有静态最终字符串TAG=“MainActivity”;
专用分区SPAGEAdapter mySectionPageAdapter;
私人视页机视页机;
私有DataForTabs DataForTabs;
私有tab1片段tab1片段;
私有Tab2Fragment Tab2Fragment;
字符串输入=”;
公共静态SharedReferences SharedReferences;
ArrayList ArrayList;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d(标记“onCreate:Starting”);
tab1Fragment=新的tab1Fragment();
tab2Fragment=新的tab2Fragment();
Log.i(“从1到主”、“输入”);
Log.i(“从1到主”,输入);
mySectionPageAdapter=newSectionSpageAdapter(getSupportFragmentManager());
//使用分区适配器设置ViewPager
viewPager=(viewPager)findViewById(R.id.container);
设置viewPager(viewPager);
TabLayout TabLayout=(TabLayout)findViewById(R.id.tabs);
tabLayout.setupWithViewPager(viewPager);
SharedReferences=this.getSharedReferences(“com.utb.iftekhar.cityweatherapsnapshot1”,Context.MODE\u PRIVATE);
}
公共无效设置ViewPager(ViewPager ViewPager){
SectionsPageAdapter=新的SectionsPageAdapter(getSupportFragmentManager());
addFragment(新的Tab1Fragment(),“Home”);
addFragment(新的Tab2Fragment(),“History”);
addFragment(新的Tab3Fragment(),“About”);
viewPager.setAdapter(适配器);
}
@凌驾
公共无效onInput1Set(字符串输入){
tab2Fragment.updateEdit(输入);
arrayList=新的arrayList();
arrayList.add(输入);
试一试{
SharedReferences.edit().putString(“arrayList”,ObjectSerializer.serialize(arrayList)).apply();
}捕获(例外e){
e、 printStackTrace();
}
}
@凌驾
public void onInput2Sent(字符串输入){
tab1Fragment.UpdateEdit(输入);
Log.i(“从2到主”,输入);
}
}
“搜索”选项卡
公共类Tab1Fragment扩展片段{
私人活动;
私人按钮;
私有编辑文本搜索CityByName;
私有文本视图weatherResultTextView=null;
私有下载任务下载任务;
私有字符串结果;
私有选项卡1FragmentListener选项卡1FragmentListener;
私有字符串citynamesearch;
公共接口选项卡1FragmentListener{
无效onInput1Set(字符串输入);
}
@可空
@凌驾
创建视图时的公共视图(LayoutFlater充气机、@Nullable ViewGroup容器、@Nullable Bundle savedInstanceState){
视图=充气机。充气(R.layout.tab1\u frag,容器,假);
getWeatherButton=(按钮)view.findViewById(R.id.getWeatherButton);
searchCityByName=(EditText)view.findViewById(R.id.searchCityByName);
weatherResultTextView=(TextView)view.findViewById(R.id.weatherResult);
mainActivity=新的mainActivity();
getWeatherButton.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
downloadTask=新的downloadTask(新的downloadTask.AsyncResponse(){
@凌驾
公共void processFinish(字符串输出){
如果(!output.equals(“”){
weatherResultTextView.setText(输出);
}否则{
weatherResultTextView.setText(“”);
}
}
});
cityNameSearched=searchCityByName.getText().toString().trim();
tab1FragmentListener.onInput1Set(cityNameSearched);
Log.i(“CityNameSearched”,CityNameSearched);
试一试{
字符串encodedCityName=URLEncoder.encode(cityNameSearched,“UTF-8”);
}捕获(例外e){
e、 printStackTrace();
}
下载任务。执行(“https://openweathermap.org/data/2.5/weather?q=“+cityNameSearched+”&appid=b6907d289e10d714a