android多个片段通过同一界面与活动通信

android多个片段通过同一界面与活动通信,android,android-fragments,interface,fragment,communication,Android,Android Fragments,Interface,Fragment,Communication,我正在开发一个我希望迁移到多个平台的应用程序。为了方便移植,我使用片段来简化流程。所以我现在只有一个活动和几个片段。在一个例子中,我有几个相同的片段的实例,具有不同的数据。显然,相同片段的每个实例都将使用相同的接口函数 我已经将参数“tag”添加到接口函数中,以标识片段的每个实例(使用创建片段时使用的标记)。我想也可以使用资源ID 我的问题:这是一个好方法吗?是否有更好或更被接受的方法 活动代码段: public class SailboatRaceActivity extends Fragme

我正在开发一个我希望迁移到多个平台的应用程序。为了方便移植,我使用
片段
来简化流程。所以我现在只有一个
活动
和几个
片段
。在一个例子中,我有几个相同的
片段的实例,具有不同的数据。显然,相同片段的每个实例都将使用相同的接口函数

我已经将参数“tag”添加到接口函数中,以标识片段的每个实例(使用创建片段时使用的标记)。我想也可以使用
资源ID

我的问题:这是一个好方法吗?是否有更好或更被接受的方法

活动代码段:

public class SailboatRaceActivity extends FragmentActivity
    implements SR_CommandsFragment.OnSR_CommandsSelectedListener,
    SR_SubCommands_Fragment.OnSR_SubCommandsSelectedListener,
    FleetListFragment.FleetList_WidthChange,
    FleetListFragment.FleetListChange,
    FleetScoringFragment.OnFS_SelectedListener,
    FleetSpinnerFragment.FleetSpinner_Selection {
// State Variables
private int mSubCommandPositon;
private int mCommandPosition;
private int mFleetSelection;
private int mFleetListColumnWidth = 0;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    if (savedInstanceState != null) {
        mSubCommandPositon = savedInstanceState.getInt("mSubCommandPositon");
        mCommandPosition = savedInstanceState.getInt("mCommandPosition");
        mFleetSelection = savedInstanceState.getInt("mFleetSelection");
        mFleetListColumnWidth = savedInstanceState.getInt("mFleetListColumnWidth");
    }
    setContentView(R.layout.sailboat_race_layout);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
}

public void onSR_CommandSelected(int position) {
    SR_SubCommands_Fragment SR_SubCFrag = (SR_SubCommands_Fragment) getFragmentManager().findFragmentById(R.id.subcommands);
    mCommandPosition = position;
    if (SR_SubCFrag != null) {
        SR_SubCFrag.update_SR_subcommands(position);
        SR_SubCFrag.ChangeListViewWidth(mFleetListColumnWidth);
    }
}

public void onSR_SubCommandSelected(int position) {
    mSubCommandPositon = position;
    FleetScoringFragment FSFrag = (FleetScoringFragment) getFragmentManager().findFragmentById(R.id.fleet_scoring);
    if (FSFrag != null) {
        FSFrag.update_commands(mCommandPosition, mSubCommandPositon);
    }
}

@Override
public void onSaveInstanceState(Bundle outState) {
    outState.putInt("mSubCommandPositon", mSubCommandPositon);
    outState.putInt("mCommandPosition", mCommandPosition);
    outState.putInt("mFleetSelection", mFleetSelection);
    outState.putInt("mFleetListColumnWidth", mFleetListColumnWidth);
    super.onSaveInstanceState(outState);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.menu_main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();

    //noinspection SimplifiableIfStatement
    if (id == R.id.action_settings) {
        return true;
    }

    return super.onOptionsItemSelected(item);
}

@Override
public void FleetList_WidthChange(int width) {
    mFleetListColumnWidth = width;
    // can we set width of other two lists
    SR_SubCommands_Fragment SR_SubCFrag = (SR_SubCommands_Fragment) getFragmentManager().findFragmentById(R.id.subcommands);
    if (SR_SubCFrag != null) {

        SR_SubCFrag.ChangeListViewWidth(width);
    }
    SR_CommandsFragment SR_CFrag = (SR_CommandsFragment) getFragmentManager().findFragmentById(R.id.commands);
    if (SR_CFrag != null) {

        SR_CFrag.ChangeListViewWidth(width);
    }
}

@Override
public void FleetListChange(int position) {
    FleetScoringFragment FSFrag = (FleetScoringFragment) getFragmentManager().findFragmentById(R.id.fleet_scoring);
    if (FSFrag != null) {
        mFleetSelection = position;
        FSFrag.update_FleetScoringList(position);
    }
    FleetScoringHeaderFragment FSHFrag = (FleetScoringHeaderFragment) getFragmentManager().findFragmentById(R.id.scoring_header);
    if (FSHFrag != null) {
        mFleetSelection = position;
        FSHFrag.update_FleetScoringHeader(position);
    }
}

@Override
public void onFS_Selected(int position) {


}

@Override
public void FSpinner_selection(int selection, String tag) {
    int fs = selection;
    String thistag =tag;
    // do something
}
FSpinner_选择界面就是我正在使用的界面。我设置这个实现只是为了检查数据是否有效

FleetSpinner代码段:

public class FleetSpinnerFragment extends Fragment  {
private int nPresentFleetPosition;
public ArrayList<FleetItem> mListArray = new ArrayList<FleetItem>();
FleetSpinnerAdapter adapter;
FleetSpinner_Selection mCallback;
Spinner spinner;
String tag;


public interface FleetSpinner_Selection {
    public void FSpinner_selection(int selection, String tag);
}

public FleetSpinnerFragment() {
}

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    try {
        mCallback = (FleetSpinner_Selection) activity;
    } catch (ClassCastException e) {
        throw new ClassCastException(activity.toString()
                + " must implement FSpinner_Selection");
    }
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (savedInstanceState == null) {
        nPresentFleetPosition = 0;
        for (int i = 0; i<Fleet.fleetbit.length;i++) {
            mListArray.add(Fleet.fleetbit[i]);
        }
    } else {
        nPresentFleetPosition = savedInstanceState.getInt("nPresentFleetPosition");
        ArrayList temp = savedInstanceState.getParcelableArrayList("thisFleetList");
        mListArray.addAll(temp);
    }
}

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    savedInstanceState.putInt("nPresentFleetPosition", nPresentFleetPosition);
    ArrayList<FleetItem>  temp = new ArrayList<FleetItem>();
    for (int i =0 ; i< adapter.getCount();i++){
        temp.add(adapter.getItem(i));
    }
    savedInstanceState.putParcelableArrayList("thisFleetList", temp);
    super.onSaveInstanceState(savedInstanceState);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View rootView = new View(getActivity());

    adapter = new FleetSpinnerAdapter(getActivity(), R.layout.fleet_list_item);
    spinner = new Spinner(getActivity());
    spinner.setAdapter(adapter);
    adapter.addAll(Fleet.fleetbit);
    spinner.setOnItemSelectedListener(new CustomOnItemSelectedListener());
    tag = getTag();
    spinner.setSelection(nPresentFleetPosition);
    return spinner;
}

public void update_FleetScoringHeader(int position) {

    nPresentFleetPosition = position;
    FrameLayout FLScoringHeader = (FrameLayout) getActivity().findViewById(R.id.scoring_header);
    TextView v1 = (TextView) FLScoringHeader.findViewById(R.id.fleet_list_item_textview);
    v1.setText(Fleet.fleetbit[nPresentFleetPosition].name);
    ImageView v0 = (ImageView) FLScoringHeader.findViewById(R.id.fleet_list_item_icon);
    v0.setImageResource(Fleet.fleetbit[nPresentFleetPosition].id);
}

static class FleetHolder {
    ImageView imgIcon;
    TextView txtTitle;
}

public class CustomOnItemSelectedListener extends Activity implements AdapterView.OnItemSelectedListener {
    @Override
    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
        FleetItem temp = (FleetItem) parent.getItemAtPosition(position);
        nPresentFleetPosition  = position;
        mCallback.FSpinner_selection(position, tag);
    }

    @Override
    public void onNothingSelected(AdapterView<?> parent) {

    }
}
公共类FleetSpinnerFragment扩展片段{
私人int nPresentFleetPosition;
public ArrayList mListArray=new ArrayList();
光纤适配器;
FleetSpinner_选择mCallback;
纺纱机;
字符串标签;
公共接口FleetSpinner\u选择{
公共void FSpinner_选择(int选择,字符串标记);
}
公共喷丝板碎片(){
}
@凌驾
公共事务主任(活动){
超级转速计(活动);
试一试{
mCallback=(FleetSpinner_选择)活动;
}catch(ClassCastException e){
抛出新的ClassCastException(activity.toString()
+“必须实施FSpinner_选择”);
}
}
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
如果(savedInstanceState==null){
nPresentFleetPosition=0;
对于(int i=0;i父级){
}
}

我刚刚开始学习android编程,所以这可能是一个很难回答的问题。

如果我是你,我可能会有一个类似MVP(Model view presenter)的模式这将分离逻辑和一些功能,并让片段独立。在您的情况下,似乎片段是紧密耦合的,更改某些内容会很麻烦。我将使用由单个活动托管的单独片段,并有一个基本活动和片段,作为提供功能。我在wikipedia上查找了MVP。我需要查找其他地方,以更好地了解它是否有帮助。我的想法是允许在更大的屏幕上显示更多微调器和相关的评分片段。我试图解决的问题是有两个或更多的微调器显示相同的列表。“//做一些有用的事情”在活动中,会告诉每个微调器要删除哪些选项,这样就不会有两个评分列表是相同的。也许将所有微调器和评分列表放在一个片段中,让活动指示大小应该是什么,会更干净。