检测对Android数据模型的更改

时间:2018-09-12 17:36:29

标签: android android-studio android-fragments addtextchangedlistener

我正在尝试使用一个MainActivity和多个片段构建一个应用程序。

在MainActivity中,我获取数据并将其存储在数据模型中。 例如,获取日出时间,然后将其显示在片段B中。 如何在不重新启动应用程序的情况下检测日出值的变化并更新Fragment中的TextView?有没有办法可以听值更改并更新textView?

这是我的代码和片段B的布局。

JAVA数据模型类

MQQueueManager qMgr = null;
MQQueue qName = null;
try {
   MQEnvironment.hostname = hostName;
   MQEnvironment.port = port;
   MQEnvironment.channel = channel;
   MQEnvironment.userID = userId;
   MQEnvironment.properties.put(MQConstants.TRANSPORT_PROPERTY, MQConstants.TRANSPORT_MQSERIES);
qMgr = new MQQueueManager(mqManager);

维护性

public class SunriseTimeClass {
    private static final SunriseTimeClass INSTANCE = new SunriseTimeClass();
    public String sunrise = "";

    private SunriseTimeClass(){ }

    public static SunriseTimeClass getInstance(){
        return INSTANCE;
    }
}

片段B布局

    override fun onCreate(savedInstanceState: Bundle?) {

      //this will clear the back stack and displays no animation on the     screen
      var sunRise = SunriseTimeClass.getInstance()

      super.onCreate(savedInstanceState)
      setContentView(R.layout.activity_main)
      setSupportActionBar(toolbar)
      supportActionBar!!.setDisplayShowHomeEnabled(true)

      getSunriseSunset()
    }

    fun getSunriseSunset(){
      val location =  com.luckycatlabs.sunrisesunset.dto.Location("40.9167654", "-74.171811")
      val calculator =  SunriseSunsetCalculator(location, "America/New_York")
      sunRise.sunrise = calculator.getOfficialSunriseForDate(Calendar.getInstance())
    }

4 个答案:

答案 0 :(得分:0)

有两种方法可以解决此问题。

FragmentB获取sunRise数据并更新其自己的TextView

FragmentB直接检索sunRise值并更新其TextView,而不是在MainActivity中进行检索。

OR

通过界面在Activity和Fragment之间进行通讯

此答案类似于该线程中的另一个答案,但更明确地说明了如何设置片段的TextView。该解决方案有几个假设,由于您的问题信息有限,可能会过分简化:

假设1 :此解决方案假定getSunriseSunset方法是同步的,即不依赖于任何服务或网络调用。如果是异步的,则在更新片段之前,您需要在MainActivity(例如onSunriseRetrieved)中使用一个单独的回调函数来监听数据返回的时间。

假设2 :此解决方案还假定您要在添加片段后立即访问该片段的视图(因此,调用executePendingTransactions)。就是说,如果让FragmentB执行自己的sunRise检索,则不需要此假设。

在“活动”中定义一个接口,然后:

    public class MainActivity extends AppCompatActivity
    {    
        public interface OnSunriseChangeListener
        {
            void onSunriseChange(String newText);
        }

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

            if (savedInstanceState == null)
            {
                getFragmentManager()
                    .beginTransaction()
                    .add(R.id.fragment_container, new FragmentB()))
                    .commit();

                //assuming you want access to the fragment's views immediately
                getFragmentManager().executePendingTransactions();
            }

            getSunriseAndUpdateFragment(fragment);

        } 

        /**
         * Assumes that getSunriseSunset is synchronous and assumes that FragmentB is created. 
         */
        private void getSunriseAndUpdateFragment()
        {
            String newSunRiseValue = getSunriseSunset();
            ((FragmentB)getFragmentManager().findFragmentById(R.id.fragment_b)).onSunriseChange(newSunRiseValue);
        }

        // other code not shown...
    }

具有FragmentB实现接口:

    public class FragmentB extends Fragment implements OnSunriseChangeListener
    { 

        @Override
        public void onSunriseChange(String newSunriseData)
        { 
            TextView textView = getView.findViewById(R.id.DisplaySunrise);
            textView.setText(newSunriseText);
        }

答案 1 :(得分:0)

(Java代码)

在片段中创建一个setter方法,该活动将由以下活动调用:

片段中:

public void setSunrise(String sunrise){
    this.sunrise = sunrise;
    //further operations..
}

在活动中:

Fragment fragment = new Fragment(); //your fragment
String s= calculator.getOfficialSunriseForDate(Calendar.getInstance());
fragment.setSunrise(s);

答案 2 :(得分:0)

如果我理解正确,那么当活动中发生某些事情时,您需要更改/更新片段。

所以我认为您可以在Activity和Fragment之间实现一个接口(回调)。

1。您需要在“活动”中创建一个界面:

   public interface OnActivityAction {
            void updateFragment();}

2。您需要在Activity中声明接口和设置器,并在需要时调用它

public OnActivityAction actionListener;

    public void setOnActionListener(OnActivityAction fragmentListener) {
        this.actionListener = fragmentListener;
    }

private void myActionToUpdate(){

      if (null != activityListener) {
            activityListener.doSomethingInFragment();
        }
}

3。然后您的Fragment中需要实现此接口并设置侦听器。

public class MyFragment extends Fragment implements OnActivityAction {

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        super.onCreateView(inflater, container, savedInstanceState);

         View rootView = inflater.inflate(R.layout.fragment_test_two, container, false);

        ((MainActivity) getActivity()).setOnActionListener(this);

         return rootView;
    }

    @Override
    public void updateFragment() {
        //Do whatever you want
    }
}

希望对您有帮助。

答案 3 :(得分:0)

  1. 从活动中添加片段



    FragmentManager fragmentManager = getSupportFragmentManager();
        android.support.v4.app.FragmentTransaction fragmentTransaction = 
     fragmentManager.beginTransaction();
     //frame_layout put in activity xml
     fragmentTransaction.add(R.id.frame_layout, drawer, "").commit();

  1. 获取Fragment实例并更新您的数据


    FragmentManager fragmentManager = getSupportFragmentManager();
    Fragment fragment = fragmentManager.findFragmentById(R.id.frame_layout);
    ((FragmentB)fragment).updateFragment("Updated value");

  1. 将片段中的公共方法设为更新textview



    public void updateFragment(String value) {
            //update textview here
           Textview.setText(value);
     }