1

在 Eclipse 中采用默认的“主/细节”流模板,并添加第三个片段(我们称之为编辑,从预先存在的细节片段启动),我现在希望在用户单击时打开编辑片段细节片段中的项目。

我已经在 Detail 片段上实现了一个接口,但是根据应用程序是在平板电脑还是手机上(双窗格与否),Iterface 需要由 Detail Activity 或 Main Activity 来实现,以便功能。我认为这是由于模板在设备未处于双窗格模式时将详细信息片段的打开作为活动实现的方式。

我是否错误地实现了这一点,或者是否有最佳实践可以让我将接口的实现统一到主要活动中?

以下是 Master 和 Detail Fragments 的一些精简片段,显示了 Detail Fragments 接口的双重实现的要求。

WaveListWactivity.java 的代码(第一个片段)

public class WaveListActivity extends FragmentActivity implements
        WaveListFragment.Callbacks,WaveDetailFragment.Callbacks {
    private boolean mTwoPane;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_wave_list);
        if (findViewById(R.id.wave_detail_container) != null) {
            mTwoPane = true;
            ((WaveListFragment) getSupportFragmentManager().findFragmentById(
                    R.id.wave_list)).setActivateOnItemClick(true);
        }
    }

    //Interface from WaveListFragment
    @Override
    public void onWaveSelected(int id) {
        if (mTwoPane) {
            getSupportFragmentManager().beginTransaction()
                    .replace(R.id.wave_detail_container, new WaveDetailFragment()).commit();

        } else {
            Intent detailIntent = new Intent(this, WaveDetailActivity.class);
            startActivity(detailIntent);
        }
    }

    //Interface from WaveDetailFragment
    @Override
    public void onItemSelected(int id) {
        if (mTwoPane) {
            getSupportFragmentManager().beginTransaction()
                    .replace(R.id.wave_detail_container, new WaveEditFragment()).addToBackStack(null).commit();

        } else {
            Intent detailIntent = new Intent(this, WaveDetailActivity.class);
            startActivity(detailIntent);
        }
    }
}

WaveDetailActivity.java 的代码(第二个片段)

public class WaveDetailActivity extends FragmentActivity implements WaveDetailFragment.Callbacks {
    private boolean mTwoPane;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_wave_detail);
        if (findViewById(R.id.wave_detail_container) != null) {
            mTwoPane = true;
        }

        if (savedInstanceState == null) {
            getSupportFragmentManager().beginTransaction().add(R.id.wave_detail_container, new WaveDetailFragment()).commit();
        }
    }

    //Callback from WaveDetailFragment
    @Override
    public void onItemSelected(int id) {
        if (mTwoPane) {
            getSupportFragmentManager().beginTransaction().replace(R.id.wave_detail_container, new WaveEditFragment()).addToBackStack(null).commit();

        } else {
            Intent detailIntent = new Intent(this, WaveEditActivity.class);
            startActivity(detailIntent);
        }
    }
}
4

1 回答 1

1

我认为您可能对FragmentActivity.Fragments和您需要在Activity. 从外观上看,所有代码片段都是Activity类而不是 Fragments. 我希望 aFragment看起来像:

/** From http://developer.android.com/training/basics/fragments/communicating.html */

public class HeadlinesFragment extends ListFragment {
OnHeadlineSelectedListener mCallback;

// Container Activity must implement this interface
public interface OnHeadlineSelectedListener {
    public void onArticleSelected(int position);
}

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);

    // This makes sure that the container activity has implemented
    // the callback interface. If not, it throws an exception
    try {
        mCallback = (OnHeadlineSelectedListener) activity;
    } catch (ClassCastException e) {
        throw new ClassCastException(activity.toString()
                + " must implement OnHeadlineSelectedListener");
    }
}

...
}

然后你的Activity

public static class MainActivity extends Activity
    implements HeadlinesFragment.OnHeadlineSelectedListener{
...

public void onArticleSelected(int position) {
    // The user selected the headline of an article from the HeadlinesFragment
    // Do something here to display that article
}
}

这的整体“流程”应该是:

  • 片段充当 UI 代码的 blob,带有所有有趣内容的回调。
  • Activity 实现的回调。

您可以执行的操作总数取决于取决于屏幕大小的片段(因此您可能有 2 个片段输入单个 Activity)。确定是否显示一个或两个片段的逻辑应该在Activity.

于 2013-06-11T07:56:56.073 回答