0

インテントを受け取り、インテントのコンテンツをネストされたフラグメントに表示するアクティビティがあります。私のコードは、効果的なナビゲーションの実装チュートリアルと同じですが、ここにあるいくつかの変更を以下に示します

例のように、フラグメントはメイン アクティビティにネストされています。

public static class DummySectionFragment extends Fragment {
    ....
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        final View rootView = inflater.inflate(R.layout.fragment_section_dummy, container, false);
    ...
    public void updateFragUI() {

        if(rootView!=null){
            ((TextView) rootView.findViewById(R.id.example)).setText(mData.getSomething());                 
     }

MainActivity がインテントを受け取った後に UI を更新できるように、フラグメントのインスタンスを取得するのに苦労しています。インテントを受け取り、フラグメントを更新するコードは次のとおりです。

    public class uiReceiver extends BroadcastReceiver {
    public void onReceive(Context context, Intent intent) {
        mData = getIntent().getParcelableExtra(ExampleService.EXAMPLE_INTENT);
        updateUI(mData);
    }
}



public void updateUI() {
        DummySectionFragment dummyFrag = (DummySectionFragment)
            getSupportFragmentManager().findFragmentById(dummyFragId);

    if(dummyFrag==null) {
        Log.v(TAG,"Dummy frag is null");
    } else {
        if(dummyFrag.isVisible()) {
            Log.v(TAG,"Dummy frag is visable ");
                            dummyFrag.updateFragUI();
        } else {
            Log.v(TAG,"Dummy frag is not visable");
        }
    }

    }

私は変数をいじっていくつかのアプローチを試みましたが、常にnullであるdummyFragIdことがわかりました。dummyFragこれまでのところ、私は試しました:

  1. フラグメントの XML コードでタグと ID を試しています。つまり、対応するプロパティを使用して (またはタグdummFragIdとして) 記述されます。R.id.dummy_fragment_id<FrameLayout ...
  2. フラグメント トランザクションからフラグメント タグを取得しますが、これは有効なナビゲーション コードでは明示的に行われません。
  3. dummyFragId = dummySectionFragment.getId()ieを使用してフラグメントIDを取得する

    @Override
    public Fragment getItem(int i) {
        switch (i) {
            case 0:
                // The first section of the app is the most interesting -- it offers
                // a launchpad into the other demonstrations in this example application.
                return new LaunchpadSectionFragment();
    
            case 1:
                Fragment dummySectionFragment = new DummySectionFragment();
                Bundle args = new Bundle();
                args.putInt(DummySectionFragment.ARG_SECTION_NUMBER, i + 1);
                dummySectionFragment.setArguments(args);
                return dummySectionFragment;
    
  4. フラグメントに受信者を登録します。(レシーバーは、UI を更新できない外部クラスです)

私は解決策に対して心を開いています。フラグメントのインテントから情報を表示する最良の方法を知りたいだけです。

4

1 に答える 1

0

フラグメントに登録メソッドを作成することで、良い解決策を見つけたと思います。アクティビティには関連するコードはなく、すべてフラグメントにあります。これが誰かに役立つことを願っています。

public static class DummySectionFragment extends Fragment {
    public void updateFragUI() {
        Log.v(TAG, "updateFragUI received");
        ((TextView) getView().findViewById(R.id.example_field))
                .setText(Double.toString(mData.getSomething()));
    }


    private IntentFilter filter = new IntentFilter(
            TransmittingService.STATE_UPDATE);

    private BroadcastReceiver mReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            mData = intent
                    .getParcelableExtra(TransmittingService.STATE_VALUES);
            updateFragUI();
        }
    };

    @Override
    public void onResume() {
        super.onResume();
        Log.v(TAG, "registering Receiver");
        getActivity().registerReceiver(mReceiver, filter);
    }

    @Override
    public void onPause() {
        super.onPause();
        Log.v(TAG, "unregistering receiver");
        getActivity().unregisterReceiver(mReceiver);
    }
...
}
于 2013-09-15T11:22:34.870 に答える