Android中堆叠片段时UI视图更新

Android中堆叠片段时UI视图更新,android,android-fragments,Android,Android Fragments,我不太擅长android碎片。我们需要一个适当的解决方案来解决我的问题。在母亲活动中,我有片段A,B,C。每个片段都是一个接一个的。首先显示一个片段,在一些用户输入之后,我们将其替换为片段B,并堆叠片段A。完成B之后,我们用C片段替换它,B在A之后堆叠。我可以返回到上一个片段编辑数据,因此我们保存用户输入 但当我回到片段时,我总是可以得到所有数据,但只能在UI视图中更新片段。我无法更新片段B和C中的任何ui视图 不同部分的代码snippes 阿比德·哈桑:获取要更新的当前对象 City curr

我不太擅长android碎片。我们需要一个适当的解决方案来解决我的问题。在母亲活动中,我有片段A,B,C。每个片段都是一个接一个的。首先显示一个片段,在一些用户输入之后,我们将其替换为片段B,并堆叠片段A。完成B之后,我们用C片段替换它,B在A之后堆叠。我可以返回到上一个片段编辑数据,因此我们保存用户输入

但当我回到片段时,我总是可以得到所有数据,但只能在UI视图中更新片段。我无法更新片段B和C中的任何ui视图

不同部分的代码snippes

阿比德·哈桑:获取要更新的当前对象

City currentCity=cityManager.getCurrentCity()

正在检查此对象的数据并更新视图

 public static void updateViews(City currentCity){

    Log.d(TAG , "updating views for city... "+currentCity.getCityName());



    if (currentCity.getCityAccommodations().size() > 0 || currentCity.getCityLocations().size() > 0 || currentCity.getHotels().size() > 0) {
        viewModifyLayoutHotels.setVisibility(View.VISIBLE);
        deSelectAccommodationRadioButton.setChecked(false);
    } else {
        viewModifyLayoutHotels.setVisibility(View.GONE);
    }

    if (currentCity.cityFlights.size() > 0) {
        viewModifyLayoutFlights.setVisibility(View.VISIBLE);
        deSelectFlyRadioButton.setChecked(false);
    } else {
        viewModifyLayoutFlights.setVisibility(View.GONE);
    }

    if(currentCity.getFlightClass().equals("")){

        viewModifyLayoutFlights.setVisibility(View.VISIBLE);
        deSelectFlyRadioButton.setChecked(false);
    }else {

        viewModifyLayoutFlights.setVisibility(View.GONE);
    }

    if (currentCity.getActivities().size() > 0) {

        viewModifyLayoutActivities.setVisibility(View.VISIBLE);
        deSelectActivityRadioButton.setChecked(false);
    } else {
        viewModifyLayoutActivities.setVisibility(View.GONE);
    }


}
从后续片段的onDestroy()方法返回事件,并从管理器获取该对象并更新视图

public static void updateViews(City currentCity){

    Log.d(TAG , "updating views for city... "+currentCity.getCityName());



    if (currentCity.getCityAccommodations().size() > 0 || currentCity.getCityLocations().size() > 0 || currentCity.getHotels().size() > 0) {
        viewModifyLayoutHotels.setVisibility(View.VISIBLE);
        deSelectAccommodationRadioButton.setChecked(false);
    } else {
        viewModifyLayoutHotels.setVisibility(View.GONE);
    }

    if (currentCity.cityFlights.size() > 0) {
        viewModifyLayoutFlights.setVisibility(View.VISIBLE);
        deSelectFlyRadioButton.setChecked(false);
    } else {
        viewModifyLayoutFlights.setVisibility(View.GONE);
    }

    if(currentCity.getFlightClass().equals("")){

        viewModifyLayoutFlights.setVisibility(View.VISIBLE);
        deSelectFlyRadioButton.setChecked(false);
    }else {

        viewModifyLayoutFlights.setVisibility(View.GONE);
    }

    if (currentCity.getActivities().size() > 0) {

        viewModifyLayoutActivities.setVisibility(View.VISIBLE);
        deSelectActivityRadioButton.setChecked(false);
    } else {
        viewModifyLayoutActivities.setVisibility(View.GONE);
    }


}
在调用onDestroy()之前,我从onStart()方法将这些视图重置为初始状态

对于那些没有更新UI的城市,我使用LocalBroadcast调用来单独更新UI线程

if (!childFragment.onBackPressed()) {
            // child Fragment was unable to handle the task
            // It could happen when the child Fragment is last last leaf of a chain
            // removing the child Fragment from stack
            Log.d(MakeATripStepFourFragment.TAG , "this fragment.. "+childFragment.getClass().getSimpleName());

            if(childFragment instanceof MakeATripStepFourFragment){
                Log.d(MakeATripStepFourFragment.TAG ,"lets try it out");
                if (cityManager.hasNextCity()) {
                    City currentCity = cityManager.getNextCity();
                    MakeATripFragmentFirstTime.destinationTextView.setText(currentCity.getCityName());

                    Log.d(MakeATripStepFourFragment.TAG, "updating radioButton with city.. "+currentCity.getCityName());
                    Intent intent = new Intent("update_radio-button");
                    intent.putExtra(MakeATripStepFourFragment.TAG,currentCity);

                    LocalBroadcastManager.getInstance(((MakeATripStepFourFragment) childFragment).getActivity()).sendBroadcast(intent);
                }
            }
            childFragmentManager.popBackStackImmediate();

        }

        // either this Fragment or its child handled the task
        // either way we are successful and done here
        return true;
    }
在广播接收器中,我调用updateViews()方法

也许我必须知道的解决方案是什么。请给我一个完美的建议

在这里,点击一个按钮,在城市对象中循环并为其添加片段,如果所有城市遍历都已完成,则继续下一个fragmet

  case R.id.next_fragment_destination_button:

            if (!cityManager.hasNextCity()) {
                Log.d("status = ", "all city explored : " + cityManager.currentCityIndex);

                cityManager.currentCityIndex = 0;
                /*LocalBroadcastManager.getInstance(mActivity).unregisterReceiver(messageReceiver);
                LocalBroadcastManager.getInstance(mActivity).unregisterReceiver(accomodationAllPreferenceReciver);
                LocalBroadcastManager.getInstance(mActivity).unregisterReceiver(activitiesForCityPreferenceReciver);
                LocalBroadcastManager.getInstance(mActivity).unregisterReceiver(updatePreferences);*/
                setDataToGetExperts(cityManager.getAllCities().size());


            } else {

                Log.d("status = ", "going to next : " + cityManager.currentCityIndex);
                Log.d(TAG, "current city size " + cityManager.getCurrentCity().toString());

                cityManager.getNextCity();

                //we have a next city
                MakeATripStepFourFragment fragment = MakeATripStepFourFragment.newInstance(0);
                FragmentTransaction transaction = getChildFragmentManager().beginTransaction();

                // Store the Fragment in stack
                transaction.addToBackStack(null);
                transaction.replace(R.id.fragment_holder, fragment ,TAG);
                transaction.commit();
            }
            break;

@WaqarYounis发布。请检查在MainActivity(您的活动)中添加片段的位置?使用eventbus动态更新片段。。。。
if (!childFragment.onBackPressed()) {
            // child Fragment was unable to handle the task
            // It could happen when the child Fragment is last last leaf of a chain
            // removing the child Fragment from stack
            Log.d(MakeATripStepFourFragment.TAG , "this fragment.. "+childFragment.getClass().getSimpleName());

            if(childFragment instanceof MakeATripStepFourFragment){
                Log.d(MakeATripStepFourFragment.TAG ,"lets try it out");
                if (cityManager.hasNextCity()) {
                    City currentCity = cityManager.getNextCity();
                    MakeATripFragmentFirstTime.destinationTextView.setText(currentCity.getCityName());

                    Log.d(MakeATripStepFourFragment.TAG, "updating radioButton with city.. "+currentCity.getCityName());
                    Intent intent = new Intent("update_radio-button");
                    intent.putExtra(MakeATripStepFourFragment.TAG,currentCity);

                    LocalBroadcastManager.getInstance(((MakeATripStepFourFragment) childFragment).getActivity()).sendBroadcast(intent);
                }
            }
            childFragmentManager.popBackStackImmediate();

        }

        // either this Fragment or its child handled the task
        // either way we are successful and done here
        return true;
    }
 private BroadcastReceiver updatePreferences = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {


        City currentCity = (City) intent.getSerializableExtra(TAG);
        Log.d(TAG , "recived call with city..."+currentCity.getCityName());
        ExpertSelectorFragment.resetCityPreferencesViews();
        updateViews(currentCity);
    }
};
  case R.id.next_fragment_destination_button:

            if (!cityManager.hasNextCity()) {
                Log.d("status = ", "all city explored : " + cityManager.currentCityIndex);

                cityManager.currentCityIndex = 0;
                /*LocalBroadcastManager.getInstance(mActivity).unregisterReceiver(messageReceiver);
                LocalBroadcastManager.getInstance(mActivity).unregisterReceiver(accomodationAllPreferenceReciver);
                LocalBroadcastManager.getInstance(mActivity).unregisterReceiver(activitiesForCityPreferenceReciver);
                LocalBroadcastManager.getInstance(mActivity).unregisterReceiver(updatePreferences);*/
                setDataToGetExperts(cityManager.getAllCities().size());


            } else {

                Log.d("status = ", "going to next : " + cityManager.currentCityIndex);
                Log.d(TAG, "current city size " + cityManager.getCurrentCity().toString());

                cityManager.getNextCity();

                //we have a next city
                MakeATripStepFourFragment fragment = MakeATripStepFourFragment.newInstance(0);
                FragmentTransaction transaction = getChildFragmentManager().beginTransaction();

                // Store the Fragment in stack
                transaction.addToBackStack(null);
                transaction.replace(R.id.fragment_holder, fragment ,TAG);
                transaction.commit();
            }
            break;