如何将选定的对话框值设置为片段中的 TextViews [重复]

Posted

技术标签:

【中文标题】如何将选定的对话框值设置为片段中的 TextViews [重复]【英文标题】:How to set selected Dialog values to TextViews in Fragment [duplicate] 【发布时间】:2014-03-16 06:54:30 【问题描述】:

我正在编写一个 android 应用程序使用片段,并且在我的一个片段中我使用了两个选择器(日期和时间)

我在谷歌上搜索并找到了解决方案通过点击按钮在片段中显示对话框,我也在做同样的事情,当用户点击相应按钮时显示对话框强>。

但我 不知道如何将对话框值设置为各自的 TextView

请参阅下面的代码,我使用的是通过点击按钮来显示对话框,

DatePickerDialogFragment.java:

public class DatePickerDialogFragment extends DialogFragment   

    private DatePickerDialog.OnDateSetListener mDateSetListener;  

    public DatePickerDialogFragment()   

      

    DatePickerDialogFragment(OnDateSetListener dateSetListener)   
        mDateSetListener = dateSetListener;  
      

    @Override  
    public Dialog onCreateDialog(Bundle savedInstanceState)   
        // Use the current date as the default date in the picker  
        final Calendar c = Calendar.getInstance();  
        int year = c.get(Calendar.YEAR);  
        int month = c.get(Calendar.MONTH);  
        int day = c.get(Calendar.DAY_OF_MONTH);  

        // Create a new instance of DatePickerDialog and return it  
        DatePickerDialog dpd = new DatePickerDialog(getActivity(), mDateSetListener, year, month,  
                day);   

        // should not accept past dates

        return dpd;  
      

  

TimePickerFragment.java:

public class TimePickerFragment extends DialogFragment implements TimePickerDialog.OnTimeSetListener

    private TimePickedListener mListener;

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState)
    
        // use the current time as the default values for the picker
        final Calendar c = Calendar.getInstance();
        int hour = c.get(Calendar.HOUR_OF_DAY);
        int minute = c.get(Calendar.MINUTE);

        // create a new instance of TimePickerDialog and return it
        return new TimePickerDialog(getActivity(), this, hour, minute, DateFormat.is24HourFormat(getActivity()));
    

    @Override
    public void onAttach(Activity activity)
    
        // when the fragment is initially shown (i.e. attached to the activity), cast the activity to the callback interface type
        super.onAttach(activity);
        try
        
            mListener = (TimePickedListener) activity;
        
        catch (ClassCastException e)
        
            throw new ClassCastException(activity.toString() + " must implement " + TimePickedListener.class.getName());
        
    

    @Override
    public void onTimeSet(TimePicker view, int hourOfDay, int minute)
    
        // when the time is selected, send it to the activity via its callback interface method
        Calendar c = Calendar.getInstance();
        c.set(Calendar.HOUR_OF_DAY, hourOfDay);
        c.set(Calendar.MINUTE, minute);

        mListener.onTimePicked(c);
    

    public static interface TimePickedListener
    
        public void onTimePicked(Calendar time);
    

Fragment1.java:

  public class Fragment1 extends SherlockFragment 

        Button buttonDate;  
        Button buttonTime; 
        Button buttonSubmit;

        TextView textDate;  
        TextView textTime;  

        Spinner spinner;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) 
        View rootView = inflater.inflate(R.layout.fragment1, container, false);

        buttonDate = (Button) rootView.findViewById(R.id.btnDate);
        buttonTime = (Button) rootView.findViewById(R.id.btnTime);   
        buttonSubmit = (Button) rootView.findViewById(R.id.btnSubmit);

        textDate = (TextView) rootView.findViewById(R.id.txtDate);
        textTime = (TextView) rootView.findViewById(R.id.txtTime);  

       /* //  calendar class get the current instance of android phone clock
         Calendar c = Calendar.getInstance();

         // a formatted object for date and time
         SimpleDateFormat sdfTime = new SimpleDateFormat("h:mm a");

         // save date and time in string object.
         String strTime = sdfTime.format(c.getTime());
         textTime.setText(strTime);

         SimpleDateFormat sdfDate = new SimpleDateFormat("dd-MMM-yyyy");
         String strDate = sdfDate.format(c.getTime());
         textDate.setText(strDate);*/

         buttonTime.setOnClickListener(new OnClickListener()
         
             @Override
             public void onClick(View v)
             
                 // show the time picker dialog
                 DialogFragment newFragment = new TimePickerFragment();
                 newFragment.show(getActivity().getSupportFragmentManager(), "timePicker");
             
         );

         buttonDate.setOnClickListener(new OnClickListener() 

            @Override
            public void onClick(View arg0) 
                // TODO Auto-generated method stub
                DialogFragment newFragment = new DatePickerDialogFragment();
                newFragment.show(getActivity().getSupportFragmentManager(), "datePicker");
            
        );

         spinner = (Spinner) rootView.findViewById(R.id.spinner);
            // Spinner click listener
         spinner.setOnItemSelectedListener((OnItemSelectedListener) getActivity());

            // Spinner Drop down elements
            List<String> categories = new ArrayList<String>();
            categories.add("Automobile");
            categories.add("Business Services");
            categories.add("Computers");
            categories.add("Education");
            categories.add("Personal");
            categories.add("Travel");

            // Creating adapter for spinner
            ArrayAdapter<String> dataAdapter = new ArrayAdapter<String> (getActivity(), android.R.layout.simple_spinner_item, categories);

            // Drop down layout style - list view with radio button
            dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

            // attaching data adapter to spinner
            spinner.setAdapter(dataAdapter);


            buttonSubmit.setOnClickListener(new OnClickListener() 

                @Override
                public void onClick(View arg0) 
                    // TODO Auto-generated method stub
                    Intent intent = new Intent(Intent.ACTION_SEND);
                    intent.setType("message/rfc822");
                    intent.putExtra(Intent.EXTRA_EMAIL, "mail@emailaddress.com");
                    intent.putExtra(Intent.EXTRA_SUBJECT, "Subject");

                    // in place of "Text" i want to show spinner's selected value
                    intent.putExtra(Intent.EXTRA_TEXT, "Text");

                    startActivity(Intent.createChooser(intent, "Send Email"));
                
            );


        return rootView;
    

     public void onTimePicked(Calendar time)
        
            // display the selected time in the TextView
            textTime.setText(DateFormat.format("h:mm a", time));
        

        public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth)   
            Calendar c = Calendar.getInstance();  
            c.set(year, monthOfYear, dayOfMonth);  
            setDate(c.getTime().getTime());  
          

        private void setDate(long millisecond)  
            int flags = DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_SHOW_YEAR  
                    | DateUtils.FORMAT_SHOW_WEEKDAY | DateUtils.FORMAT_ABBREV_MONTH  
                    | DateUtils.FORMAT_ABBREV_WEEKDAY;  
            String dateString = DateUtils.formatDateTime(getActivity(),millisecond, flags);  
            textDate.setText(dateString);  
          



MainActivity.java:

public class MainActivity extends SherlockFragmentActivity  implements TimePickedListener, OnItemSelectedListener, OnDateSetListener 
    // Declare Variables
    Fragment1 fragmentTab1;
    ListView list;
    NavListAdapter adapter;
    String[] title;
    String[] subtitle;
    int[] icon;
    Fragment fragment1 = new Fragment1();
    Fragment fragment2 = new Fragment2();
    Fragment fragment3 = new Fragment3();

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);

        // Generate title
        title = new String[]  "Title Fragment 1", "Title Fragment 2",
                "Title Fragment 3" ;

        // Generate subtitle
        subtitle = new String[]  "Subtitle Fragment 1", "Subtitle Fragment 2",
                "Subtitle Fragment 3" ;

        // Generate icon 
        icon = new int[]  R.drawable.action_about, R.drawable.action_settings,
                R.drawable.collections_cloud ;

        // Pass results to NavListAdapter Class
        adapter = new NavListAdapter(this, title, subtitle, icon);

        // Hide the ActionBar Title
        getSupportActionBar().setDisplayShowTitleEnabled(false);

        // Create the Navigation List in your ActionBar
        getSupportActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);

        // Listen to navigation list clicks
        ActionBar.OnNavigationListener navlistener = new OnNavigationListener() 

            @Override
            public boolean onNavigationItemSelected(int position, long itemId) 
                FragmentTransaction ft = getSupportFragmentManager()
                        .beginTransaction();
                // Locate Position
                switch (position) 
                case 0:
                    ft.replace(android.R.id.content, fragment1);
                    break;
                case 1:
                    ft.replace(android.R.id.content, fragment2);
                    break;
                case 2:
                    ft.replace(android.R.id.content, fragment3);
                    break;
                
                ft.commit();
                return true;
            

        ;
        // Set the NavListAdapter into the ActionBar Navigation
        getSupportActionBar().setListNavigationCallbacks(adapter, navlistener);
    

    @Override
    public void onTimePicked(Calendar time) 
        // TODO Auto-generated method stub

    

     @Override
     public void onItemSelected(AdapterView<?> parent, View view, int position, long id)           
            // On selecting a spinner item
            String item = parent.getItemAtPosition(position).toString();            
            // showing a toast on selecting an item
            Toast.makeText(parent.getContext(), item, Toast.LENGTH_LONG).show();
     

     public void onNothingSelected(AdapterView<?> arg0) 
     


     @Override  
     public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth)   


       

为了更清楚,我发布屏幕截图,请检查并告诉我,我缺少什么。

屏幕 1:默认显示

屏幕 2:显示时间选择器对话框

屏幕 3: 显示日期选择器对话框

【问题讨论】:

您能否添加更多详细信息来说明您要在文本视图中插入的内容? 用户使用各自的对话框选择的值(日期和时间),这就是为什么我使用两个按钮和两个文本视图,如您在 Fragment1 中看到的那样 您是否对从对话框中获取结果或为 setText 格式化结果感到困惑? 【参考方案1】:

您还可以将TextView 的对象传递给TimePickerFragmentDatePickerFragmentDialogFragment

以下是示例概览。

创建DatePickerFragment 的构造函数作为TextView 的参数并在该TextView 上设置日期。

public class DatePickerFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener 


    TextView mTextView;
    DatePickerDialog mDatePickerDialog;

    public DatePickerFragment(TextView textview)
    
        mTextView = textview;
    

     @Override
     public Dialog onCreateDialog(Bundle savedInstanceState) 

             mDatePickerDialog = new DatePickerDialog(getActivity(), this, intYear, intMonth, intDay);

         return mDatePickerDialog;
    

    @Override
    public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) 

            mTextView.setText(String.valueOf(dayOfMonth)+"/"+String.valueOf(monthOfYear+1)+"/"+String.valueOf(year));
    

textview怎么传?

DialogFragment newFragment = new DatePickerFragment(textDate);
newFragment.show(getActivity().getSupportFragmentManager(), "datePicker");

TimePickerFragment

DialogFragment newFragment = new TimePickerFragment(textTime);
newFragment.show(getActivity().getSupportFragmentManager(), "datePicker");

【讨论】:

我的意思是试过但没有解决,你能帮我试试这个吗? @AbrahimNeil 我已经尝试过了,这在这里工作正常...... 在文档中指出:避免在片段中使用非默认构造函数:使用默认构造函数加上 Fragment#setArguments(Bundle) 代替【参考方案2】:

尝试在 Fragment1 中实现您的侦听器,因为您的 textview 在 fragment1 视图中。

意义

public class Fragment1 implements OnDateSetListener

// Your regular methods and codes


@Override
public void onDateSet(DatePicker picker, int year, int month,int day) 
    int flags = DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_SHOW_YEAR  
            | DateUtils.FORMAT_SHOW_WEEKDAY | DateUtils.FORMAT_ABBREV_MONTH  
            | DateUtils.FORMAT_ABBREV_WEEKDAY;  
    String dateString = DateUtils.formatDateTime(getActivity(),millisecond, flags);  
    textDate.setText(dateString); 

    

如果您在活动中需要片段中的日期,您可以在片段中编写 getmethod

public String getDate()
    return textDate.getText();

该示例仅显示 DatePicker,但我相信您可以为 TimePicker 执行相同的操作。

干杯

【讨论】:

以上是关于如何将选定的对话框值设置为片段中的 TextViews [重复]的主要内容,如果未能解决你的问题,请参考以下文章

突出显示可展开列表中的选定项目

如何将活动中的searchview的输入发送到该活动的视图寻呼机中的片段

如何将选定的 extjs 组合值设置为另一个组合框

启动对话框以获取结果以将值返回给主要活动

ng-options 将 ng-model 值设置为空白列表中的选定项

如何设置动态下拉列表的选定值