0

フラグメントを交換する ActionBar タブ ナビゲーションを利用するアプリに取り組んでいます。各タブは同じ listfragment を呼び出しますが、データ セットは異なります。ユーザーがマイ リスト フラグメント内の項目を選択すると、詳細リスト フラグメントが表示されます。詳細リスト フラグメント内に、外部 OnClickListener の相互参照を含むダイアログを表示するボタンがあります。

ダイアログ選択からのデータを使用して新しい詳細フラグメントを表示するルート リスト フラグメントにコールバックを実装しようとしています。

私の問題は、MainActivity が 1 つしかなく、それ以外はすべてフラグメントであることです。コールバックを開始する方法がわかりません。

OnClickListener を開始し、詳細フラグメントの OnActivityCreate メソッドでボタンに設定する方法は次のとおりです。

    // create instance of the OnClickListener
    SeeAlsoOnClickListener seeAlsoListener = new SeeAlsoOnClickListener(this.getActivity(), seeAlsoList, categories);
    button.setOnClickListener(seeAlsoListener);

ここに私の SeeAlsoOnClickListener クラスがあります:

public class SeeAlsoOnClickListener implements OnClickListener {

private Context context;
private ArrayList<String> categories;
private String[] seeAlsoList;
private String selection;


public SeeAlsoOnClickListener(Context context, String[] array, ArrayList<String> categories) {
    this.context = context;
    this.seeAlsoList = array;
    this.categories = categories;
}

@Override
public void onClick(View v) {
    // TODO Auto-generated method stub
    ListAdapter adapter = new ArrayAdapter<String>(context, R.layout.see_also_picker, seeAlsoList) {

        ViewHolder holder;
        Drawable icon;

        class ViewHolder {
            ImageView icon;
            TextView title;
        }

        public View getView(int position, View convertView, ViewGroup parent) {
            final LayoutInflater inflater = (LayoutInflater) context
                    .getSystemService(
                            Context.LAYOUT_INFLATER_SERVICE);

            if (convertView == null) {
                convertView = inflater.inflate(
                        R.layout.see_also_picker, null);

                holder = new ViewHolder();
                holder.icon = (ImageView) convertView
                        .findViewById(R.id.icon);
                holder.title = (TextView) convertView
                        .findViewById(R.id.title);
                convertView.setTag(holder);
            } else {
                // view already defined, retrieve view holder
                holder = (ViewHolder) convertView.getTag();
            }       

            int tile = 0;
            switch (Integer.parseInt(categories.get(position))) {
                case 0:
                    tile = context.getResources().getIdentifier("acronyms","drawable",context.getPackageName());
                    break;
                case 1:
                    tile = context.getResources().getIdentifier("algorithm","drawable",context.getPackageName());
                    break;
                case 2:
                    tile = context.getResources().getIdentifier("anatomy","drawable",context.getPackageName());
                    break;
                case 3:
                    tile = context.getResources().getIdentifier("calculator","drawable",context.getPackageName());
                    break;
                case 4:
                    tile = context.getResources().getIdentifier("medicine","drawable",context.getPackageName());
                    break;
                case 5:
                    tile = context.getResources().getIdentifier("treatment","drawable",context.getPackageName());
                    break;
            }

            holder.title.setText(seeAlsoList[position]);
            holder.icon.setImageResource(tile);

            return convertView;
        }
    };

    // display alert dialog
    AlertDialog.Builder builder = new AlertDialog.Builder(context);
    builder.setTitle("See Also");
    builder.setAdapter(adapter,
            new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog,int item) {                      
                    // get the selection
                    selection = seeAlsoList[item];                  
                }
            });
    AlertDialog alert = builder.create();
    alert.show();
}
}

選択に基づいて別のフラグメントに交換する必要があることを除いて、これはすべてうまく機能します。どんな考えや提案も大歓迎です!ありがとうございます。

4

1 に答える 1

0

次の 2 つの方法をお勧めします。

1) 非リスト フラグメントでコールバック インターフェイスを定義し、このコールバックを MainActivity で実装し、フラグメントの onAttach() メソッドでコールバック インスタンスを取得できます。アクティビティよりも、findFragmentById() または findFragmentByTag() を使用して、ListFragment への直接リンクを取得し、パブリック メソッドを呼び出すことができます。たとえば、テーマ、swapData(datalist) を定義します。

このアプローチの詳細 -公式ドキュメント

2) リスト フラグメントで BroadcastReceiver を定義し、Extra データに基づいて onReceive() メソッドでデータをスワップします。ダイアログの onClick() メソッドから、Extras で必要なデータを含むブロードキャストを送信する必要があります。

于 2013-10-13T21:46:52.653 に答える