【问题标题】:Passing Back Data from a DialogFragment to Its Calling Activity? [duplicate]将数据从 DialogFragment 传递回其调用活动? [复制]
【发布时间】:2018-02-06 03:59:52
【问题描述】:

我的目标是将 DialogFragment 中的字符串传递给它的调用 Activity。如果我理解正确,我认为需要在调用 Activity 中实现接口。我认为目的包括创建一个“监听器”方法。

当放置在扩展 DialogFragment 的类中时,“getActivity()”似乎没有到达调用 Activity。它似乎无法识别我添加的任何自定义方法。

我应该如何处理这个问题?感谢您的宝贵时间。

编辑 01: 也许我对某些事情视而不见,但我不明白为什么 DialogFragment 扩展类中的“getActivity()”方法引用了错误的对象。再次感谢。

MainActivity.java:

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;


public class MainActivity extends AppCompatActivity {       //implements Something

    String dateThing;
    EditText date_EditText;
    DatePickerFragment newFragment;


    @Override
    protected void onCreate( Bundle savedInstanceState ) {

        super.onCreate( savedInstanceState );
        setContentView( R.layout.activity_main );

        dateThing = "Change This";

        //This just changes the title of the ToolBar.
        getSupportActionBar().setTitle( "Date Changing Test" );

        date_EditText = findViewById( R.id.dateXML );
        date_EditText.setText( dateThing );

    }


    public void showDatePicker_Thing( View v ) {

        newFragment = new DatePickerFragment();
        newFragment.show( getFragmentManager(), "date picker" );

    }


    public void setDate_in_EditText( String date_for_Setting_the_EditText ) {

        date_EditText.setText( date_for_Setting_the_EditText );

    }

}

DatePickerFragment.java:

import android.app.Activity;
import android.app.DatePickerDialog;
import android.app.Dialog;
import android.app.DialogFragment;
import android.os.Bundle;
import android.widget.DatePicker;
import android.widget.Toast;

import java.sql.Date;
import java.util.Calendar;


public class DatePickerFragment extends DialogFragment {

    Date testDate;


    @Override
    public Dialog onCreateDialog( Bundle savedInstanceState ) {

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


        return new DatePickerDialog( getActivity(), dateSetting_Listener, year, month, day );

    }


    private DatePickerDialog.OnDateSetListener dateSetting_Listener =
            new DatePickerDialog.OnDateSetListener() {

        public void onDateSet( DatePicker view, int year, int month, int day ) {

            testDate = Date.valueOf( view.getYear() + "-" + ( view.getMonth() +1 ) + "-"
                    + view.getDayOfMonth() );

            Toast.makeText( getActivity(), "The selected date:  " + testDate.toString(),
                    Toast.LENGTH_LONG ).show();

            Activity activityTest = getActivity();


            //************************************************************************
            //TODO  "setDate_in_EditText()" NOT FOUND AS A METHOD FROM "MainActivity".
            //getActivity().setDate_in_EditText( "test" );
            getActivity();
            //************************************************************************

        }
    };

}

activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center_horizontal"

    android:orientation="vertical"
    android:scrollbarAlwaysDrawVerticalTrack="true"
    android:scrollbars="vertical"
    android:showDividers="none"

    tools:context="com.moocow.datepickerfragment_test.MainActivity"
    >


    <TextView
        android:id="@+id/title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="\nAdjustments Stuff"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:textStyle="bold"
        />


    <EditText
        android:id="@+id/dateXML"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:inputType="textPersonName"
        android:onClick="showDatePicker_Thing"
        />

</LinearLayout>

【问题讨论】:

    标签: java android dialogfragment


    【解决方案1】:

    您需要将getActivity() 转换为MainActivity 然后只有您可以访问setDate_in_EditText() 方法

    ((MainActivity)getActivity()).setDate_in_EditText("test");
    

    【讨论】:

    • 我认为这是我第一次目睹(或至少注意到)在转换时需要一组额外的括号,除了 Java OCP 材料。这解决了我的问题,感谢您的洞察力。
    【解决方案2】:

    将 DatePickerFragment 设为 Activity 中的内部类。

    通过调用下面的方法传递值。

    这在活动中:

    public void setDate(String strDate){
    
    if(strDate!=null&&strDate.length()>0)
    etDate.setText(strDate);
    
    }
    

    【讨论】:

    • 我同意您的方法有效,但我选择的答案解决了我的“getActivity()”问题。非常感谢。
    • @WesLange 所以上面 priyanka-madgundi 的回答是要走的路。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-25
    • 1970-01-01
    • 2017-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多