我正在尝试使用一个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())
}
答案 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)
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();
FragmentManager fragmentManager = getSupportFragmentManager();
Fragment fragment = fragmentManager.findFragmentById(R.id.frame_layout);
((FragmentB)fragment).updateFragment("Updated value");
public void updateFragment(String value) {
//update textview here
Textview.setText(value);
}