5

Tabs ActionBar with Fragments를 사용합니다. 한 조각 안에 버튼이 있습니다. 버튼을 누를 때 DialogFragment (제 조각 내)을 표시하고 싶습니다. 어떻게해야합니까? actionBar의 Fragment에서 DialogFragment를 표시하는 방법 android

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(); 
    } 


} 

답변

13

사용이)() 대신에서 getSupportFragmentManager의 조각

FragmentManager fm = getActivity().getSupportFragmentManager(); 
DialogFragment dialog = new MyDialogFragment(); // creating new object 
dialog.show(fm, "dialog"); 
+0

있습니다 getSupportFragmentManager()와의 오류 –

+2

DialogFragment의 가져 오기를 확인하십시오. 지원되는 라이브러리 –

+0

이어야합니다. ( –

3

사용 getChildFragmentManager (에서 dialogfragment을 보여 내 코드입니다; 이

FragmentManager fm = getActivity().getChildFragmentManager(); 
DialogFragment dialog = MyDialogFragment(); 
dialog.show(fm, "dialog"); 
+0

이 문제가 해결되었습니다. 나는'getActivity(). getSupportFragmentManager()'를 잘못 사용하고 있었고 뒤로 버튼이 깨졌습니다. –

+0

'getActivity(). getChildFragmentManager()'이 (가) 유효한 메소드가 아닙니다. 난 당신이 단지'getChildFragmentManager()'를 의미한다고 생각한다. ('Fragment'에서 호출한다고 가정한다.) – bcorso

0

처럼 당신은 직접 우리가 값을 전달 것처럼 대화 조각 에 인수를 전달하려는 getFragmentManager() - 안돼의 getChildFragmentManager()의 필요 또는 getSupportFragmentManager()

DialogFragment dialog = new YourDialogFragment(); 
dialog.show(getFragmentManager(), "yourDialog"); 
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");