【问题标题】:Update fragment on all activities更新所有活动的片段
【发布时间】:2020-12-15 19:08:18
【问题描述】:

我创建了一个基本上是计数器的片段。按下时,它会更新您喝过的水杯的数量。此数据存储在 SharedPreferences 中。我也每天更新一次这个号码。 所以我在两个活动的 xml 中插入了片段:Main 和 Timer。 它在 Main 上完美运行,当我启动 TimerActivity 时它也可以工作,但是当我从 Timer 返回 Main 时,我看到我在 MainActivity 中达到的最后一个数字,它没有更新并忽略我从 TimerActivity 的点击。 我认为“this.getActivity”中的问题,但我不知道如何解决它。谢谢

片段代码

import android.content.Context;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

import androidx.fragment.app.Fragment;

import com.example.fitapp.R;

import java.util.Calendar;
public class WaterBottleFragment extends Fragment {
    LinearLayout waterBottle;
    TextView iconName;

    SharedPreferences sPref;
    int counter;
    @Override

    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_water_bottle, container, false);

        // Update once a day
        Calendar calendar = Calendar.getInstance();
        int currentDay = calendar.get(Calendar.DAY_OF_MONTH);
        sPref = this.getActivity().getSharedPreferences("startApp", Context.MODE_PRIVATE);
        int lastDay = sPref.getInt("day", 0);
        if(lastDay != currentDay){
            SharedPreferences.Editor ed = sPref.edit();
            ed.putInt("day", currentDay);
            ed.commit();
            counter = 0;
        } else {
            counter = (int) loadText();
        }

        waterBottle = (LinearLayout) view.findViewById(R.id.ll_water_bottle);
        iconName = (TextView) view.findViewById(R.id.tv_icon_water);

        
        iconName.setText(counter + " glasses");
        waterBottle.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                counter++;
                iconName.setText(counter + " glasses");
                saveText();
            }
        });

        return view;
    }

    // Save number of glasses
    private void saveText() {
        sPref = this.getActivity().getSharedPreferences("water_counter", Context.MODE_PRIVATE);
        SharedPreferences.Editor ed = sPref.edit();
        ed.putInt("num_of_glasses", counter);
        ed.commit();
        Toast.makeText(this.getActivity(), "updated", Toast.LENGTH_SHORT).show();
    }

    // Load number of glasses
    private int loadText() {
        sPref = this.getActivity().getSharedPreferences("water_counter", Context.MODE_PRIVATE);
        int savedCounter = sPref.getInt("num_of_glasses", 2);
        return savedCounter;
    }
}

【问题讨论】:

  • 考虑发布一些测试用例或重现所需的其他类

标签: android android-fragments android-activity


【解决方案1】:

这没什么大不了的,只需创建一个类似的界面:

Public interface WaterBottleEventListener{
void onBottleClick();
}

在片段中创建一个界面对象:

WaterBottleEventListener listener;
 

然后在你的 waterBottle.setonclicklistener 中调用它:

waterBottle.setonclicklistener(){
@override
onclick(View v){
listener.onbottleclick();
}
}

然后让你的两个活动都实现这个接口,并在每个实现中放置你的更新玻璃代码,如下所示:

Activity1 implement waterBottleEventListener{


@override
onBottleclick(){
counter++;
IconName.setText(...)
...

}


}

【讨论】:

  • iconName 和 saveText 或 loadText 等方法在 Fragment 类中,我应该使用 FragmentManager 来管理 iconName 并将我的方法放在两个活动中吗?还有计数器,它是在 Fragment 中定义的,我怎样才能访问这个变量?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-20
  • 1970-01-01
  • 2021-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多