【问题标题】:Three Fragments, interface on second Fragment requiring implementation on both Main and Second Activity三个 Fragment,第二个 Fragment 上的接口需要在 Main 和 Second Activity 上实现
【发布时间】:2013-06-11 07:29:30
【问题描述】:

在 Eclipse 中采用默认的“Master/Detail”流模板,并添加第三个 Fragment(我们称之为 Edit,从预先存在的 Detail Fragment 启动),我现在希望在用户打开 Edit Fragment点击 Detail Fragment 中的项目。

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

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

这里有一些来自 Master 和 Detail Fragments 的简化的 sn-ps,显示了 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);
        }
    }
}

【问题讨论】:

    标签: android android-activity fragment communication


    【解决方案1】:

    我认为您可能对FragmentActivityFragments 和您需要在Activity 上实现的回调接口之间的区别感到有些困惑。从外观上看,所有的代码 sn-ps 都是Activity 类,而不是 Fragments。我希望Fragment 看起来像:

    /** 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中完成。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-19
      • 2021-03-27
      • 1970-01-01
      • 2018-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-12
      相关资源
      最近更新 更多