5

我将 Tabs ActionBar 与 Fragments 一起使用。在一个片段内我有按钮。我想在DialogFragment按下按钮时显示一个(在我的片段内)。我怎样才能做到这一点?

这是我的代码

 public class MainActivity extends FragmentActivity implements EditNameDialogListener {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //showEditDialog();
        ActionBar actionbar = getActionBar();
        // Tell the ActionBar we want to use Tabs.
        actionbar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
        // initiating both tabs and set text to it.
        ActionBar.Tab InboxTab = actionbar.newTab().setText("One");
        ActionBar.Tab SentTab = actionbar.newTab().setText("Two");

        Fragment InboxFragment = new Inbox();
        Fragment SentFragment = new SentBox();
        InboxTab.setTabListener(new MyTabsListener(InboxFragment));
        SentTab.setTabListener(new MyTabsListener(SentFragment));
        actionbar.addTab(InboxTab);
        actionbar.addTab(SentTab);
    }

    private void showEditDialog() {
        FragmentManager fm = getSupportFragmentManager();
        EditNameDialog editNameDialog = new EditNameDialog();
        editNameDialog.show(fm, "fragment_edit_name");
    }

    @Override
    public void onFinishEditDialog(String inputText) {
        Toast.makeText(this, "Hi, " + inputText, Toast.LENGTH_SHORT).show();
    }

}
class MyTabsListener implements ActionBar.TabListener {
    public Fragment fragment;

    public MyTabsListener(Fragment fragment) {
        this.fragment = fragment;
    }
    public class Inbox extends Fragment implements EditNameDialogListener{

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            // Inflate the layout for this fragment
            Utility util = new Utility(getActivity());
            View view =  inflater.inflate(R.layout.inbox, container, false);
            ArrayList<String[]> searchResults = util.ReadFile();

            final ListView lv1 = (ListView) view.findViewById(R.id.inboxList);
            lv1.setAdapter(new MyCustomBaseAdapter(getActivity(), searchResults));

            lv1.setOnItemClickListener(new OnItemClickListener() {
             @Override
             public void onItemClick(AdapterView<?> a, View v, int position, long id) {
                 Object o = lv1.getItemAtPosition(position);
                 String[] fullObject = (String[])o;
                Toast.makeText(getActivity(), "You have chosen: " + " " + fullObject[0], Toast.LENGTH_LONG).show();
             } 
            });

            return view;
        }

        @Override
        public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
            // TODO Auto-generated method stub
            super.onCreateOptionsMenu(menu, inflater);
        }

        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            // TODO Auto-generated method stub


            switch (item.getItemId()) {
            case R.id.menu_settings:

                showEditDialog();
                break;

            default:
                break;
            }
            return super.onOptionsItemSelected(item);
        }

        private void showEditDialog() {
            FragmentManager ft = getSupportFragmentManager();
            EditNameDialog editNameDialog = new EditNameDialog();
            editNameDialog.show(ft, "fragment_edit_name");
        }

        @Override
        public void onFinishEditDialog(String inputText) {
            Toast.makeText(getActivity(), "Hi, " + inputText, Toast.LENGTH_SHORT).show();
        }


    }

        @Override
        public void onTabReselected(Tab tab, FragmentTransaction ft) {
            /*
             * Toast.makeText(StartActivity.appContext, "Reselected!",
             * Toast.LENGTH_LONG).show();
             */
        }

        @Override
        public void onTabSelected(Tab tab, FragmentTransaction ft) {
            ft.replace(R.id.fragment_container, fragment);
        }

        @Override
        public void onTabUnselected(Tab tab, FragmentTransaction ft) {
            ft.remove(fragment);
        }

    }

public class EditNameDialog extends DialogFragment implements OnEditorActionListener{

     public interface EditNameDialogListener {
            void onFinishEditDialog(String inputText);
        }

        private EditText mEditText;

        public EditNameDialog() {
            // Empty constructor required for DialogFragment
        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            View view = inflater.inflate(R.layout.fragment_edit_name, container);
            mEditText = (EditText) view.findViewById(R.id.txt_your_name);
            getDialog().setTitle("Hello");

            // Show soft keyboard automatically
            mEditText.requestFocus();
            getDialog().getWindow().setSoftInputMode(LayoutParams.SOFT_INPUT_STATE_VISIBLE);
            mEditText.setOnEditorActionListener(this);

            return view;
        }

        @Override
        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
            if (EditorInfo.IME_ACTION_DONE == actionId) {
                // Return input text to activity
                EditNameDialogListener activity = (EditNameDialogListener) getActivity();
                activity.onFinishEditDialog(mEditText.getText().toString());
                this.dismiss();
                return true;
            }
            return false;
        }
public class Inbox extends Fragment implements EditNameDialogListener{

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        Utility util = new Utility(getActivity());
        View view =  inflater.inflate(R.layout.inbox, container, false);
        ArrayList<String[]> searchResults = util.ReadFile();

        final ListView lv1 = (ListView) view.findViewById(R.id.inboxList);
        lv1.setAdapter(new MyCustomBaseAdapter(getActivity(), searchResults));

        lv1.setOnItemClickListener(new OnItemClickListener() {
         @Override
         public void onItemClick(AdapterView<?> a, View v, int position, long id) {
             Object o = lv1.getItemAtPosition(position);
             String[] fullObject = (String[])o;
            Toast.makeText(getActivity(), "You have chosen: " + " " + fullObject[0], Toast.LENGTH_LONG).show();
         } 
        });

        return view;
    }

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        // TODO Auto-generated method stub
        super.onCreateOptionsMenu(menu, inflater);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // TODO Auto-generated method stub


        switch (item.getItemId()) {
        case R.id.menu_settings:

            showEditDialog();
            break;

        default:
            break;
        }
        return super.onOptionsItemSelected(item);
    }

    private void showEditDialog() {
        FragmentManager ft = getSupportFragmentManager();
        EditNameDialog editNameDialog = new EditNameDialog();
        editNameDialog.show(ft, "fragment_edit_name");
    }

    @Override
    public void onFinishEditDialog(String inputText) {
        Toast.makeText(getActivity(), "Hi, " + inputText, Toast.LENGTH_SHORT).show();
    }


}
4

4 回答 4

13

使用它来显示来自片段的对话片段

FragmentManager fm = getActivity().getSupportFragmentManager();
DialogFragment dialog = new MyDialogFragment(); // creating new object
dialog.show(fm, "dialog");
于 2013-03-17T08:59:56.173 回答
3

使用 getChildFragmentManager() 而不是 getSupportFragmentManager(); 像这样

FragmentManager fm = getActivity().getChildFragmentManager();
DialogFragment dialog = MyDialogFragment();
dialog.show(fm, "dialog");
于 2013-08-29T06:30:25.273 回答
1

您也可以直接使用getFragmentManager().NogetChildFragmentManager()getSupportFragmentManager()

DialogFragment dialog = new YourDialogFragment();
dialog.show(getFragmentManager(), "yourDialog");
于 2016-05-03T09:35:45.430 回答
0
FragmentManager fm = getActivity().getChildFragmentManager();
DialogFragment dialog = MyDialogFragment();
dialog.show(fm, "dialog");

想要将参数传递给对话片段就像我们将值从一个活动传递到另一个

 FragmentManager fm = getActivity().getChildFragmentManager();
 DialogFragment dialog = MyDialogFragment();

  Bundle args = new Bundle();
  args.putString("Key", "Your String");

  dialog.setArguments(args);
  dialog.show(fm, "dialog");
于 2016-10-02T19:14:04.077 回答