2014-09-17 3 views
0

다음과 같은 상황이 있습니다 : 대화가 있습니다. 이 대화 상자에는 단편이 있는데 버튼이 있습니다. 이 Button은 DatePickDialog (DatePickFragment)를 호출합니다. 날짜를 설정하면 올바른 경우이 방법은날짜를 사용하여 단추의 텍스트를 변경하십시오.

onDateSet(DatePicker view, int year, int month, int day) 

이라고합니다. (그렇지 않다면 말해주세요!). 이제 Button의 Text를 Date로 변경하려고합니다. 이미 날짜를 문자열로 변환하는 메서드가 있습니다. 하지만 어떻게 xml 파일의 단추에 onDateSet 메서드에서 얻을 알아낼 수 없다 ... findViewById 사용할 수 없습니다. 내가보기 (DatePicker)를 사용할 수 있다고 생각했지만 어떻게해야할지 모르겠다. ...

DatePicker 용 자바 파일은 별도의 패키지 (도구)에있다. 필요할 경우이 메서드를 재사용하는 것이 가장 적합 할 것이다. 다른 곳. 그러나 그것은 나에게 그다지 중요하지 않습니다.

좀 더 코드 : DatePickerFragment.java

package com.domain.app.tools; 

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

import java.util.Calendar; 

public class DatePickerFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener 
{ 
    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) 
    { 
     final Calendar myCalendar = Calendar.getInstance(); 
     int year = myCalendar.get(Calendar.YEAR); 
     int month = myCalendar.get(Calendar.MONTH); 
     int day = myCalendar.get(Calendar.DAY_OF_MONTH); 

     return new DatePickerDialog(getActivity(), this, year, month, day); 
    } 

    @Override 
    public void onDateSet(DatePicker view, int year, int month, int day) 
    { 
     //Here I am stuck 
     dateToString(year, month, day); 
    } 

    public String dateToString(int year, int month, int day) 
    { 
     StringBuffer sb = new StringBuffer(); 
     sb.append(day + "." + month + "." + year); 

     return sb.toString(); 
    } 
} 

dialog_create.xml

<?xml version="1.0" encoding = "utf-8"?> 
<RelativeLayout 
    xmlns:android = "http://schemas.android.com/apk/res/android" 
    xmlns:tools = "http://schemas.android.com/tools" 
    android:id = "@+id/dialog_create" 
    android:layout_width = "match_parent" 
    android:layout_height = "match_parent" 
    android:background="@color/create_bg_1" 
    tools:context = ".CreateDialogFragment" 
    > 

    <EditText 
     android:id = "@+id/dialog_create_name" 
     android:layout_width = "match_parent" 
     android:layout_height = "@dimen/textFieldHight" 
     android:text = "@string/create_name" 
     android:background="@color/white" 
     android:layout_marginTop="4dp" 
     android:layout_marginBottom="4dp" 
     android:layout_marginLeft="4dp" 
     android:layout_marginRight="4dp" 
     /> 


    <Button 
     android:layout_width = "wrap_content" 
     android:layout_height = "@dimen/textFieldHight" 
     android:ems = "6" 
     android:text = "@string/date" 
     android:background="@color/white" 
     android:id = "@+id/create_date_button" 
     android:onClick = "pickDate" 
     android:layout_below = "@id/dialog_create_name" 
     /> 


</RelativeLayout> 

MainActivity.java - 일부

public class MainActivity extends Activity implements HomeFragment.OnFragmentInteractionListener 
{ 
    CreateDialogFragment createDialogFragment; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     homeFragment = new HomeFragment(); 

     fragmentManager.beginTransaction().add(R.id.mainFrame, homeFragment).commit(); 
     findViewById(R.id.bottomButton_home).setBackgroundResource(R.drawable.ic_home); 
    } 



    public void openCreate(View view) 
    { 
     createDialogFragment = new CreateDialogFragment(); 
     createDialogFragment.show(fragmentManager, "TEST"); 

     updateSelectedButton(3); 
    } 




    public void pickDate(View v) 
    { 
     DialogFragment datePicker = new DatePickerFragment(); 
     datePicker.show(getFragmentManager(), String.format(getResources().getString(R.string.pickDate))); 

     ((EditText) v).setText();//Here I am stuck 
    } 
[...] 
} 

내가 어떤 도움을 주셔서 감사합니다. 존

+1

더 많은 코드를 붙여 넣을 수 있습니까? –

+0

관련 코드 샘플이 있으므로 지금 질문을 편집했습니다 ... – JRsz

답변

1

첫째, 내가 추측하고있어 그것을 사용할 필요가 당신이하려는 버튼 의 텍스트를 변경하십시오, 당신의 MainActivity에 살고 있습니다.

내 친구에게 인터페이스를 설정해야합니다.

확실하지는 않지만 DatePickerFragment에서 onAttach 메서드를 재정의하고 매개 변수 활동을 인터페이스로 처리 할 수 ​​있습니다.

그런 다음 인터페이스에서 메소드를 호출하여 버튼 텍스트를 변경하십시오. 당신의 조각에 그런

//You create a new interface 
public interface MyInterface { 
    public void changeTheButton(/*The parameters you need to send form the fragment to the activity*/); 
} 

:

그것은 거의 같은 것 당신의 활동에

//In your DatePickerFragment 
MyInterface i; 

@Override 
public void onAttach (Activity theParentActivity) { 
    i = (MyInterface) theParentActivity; 
} 

@Override 
public void onDateSet(DatePicker view, int year, int month, int day) 
{ 
    //Here you call the interface 
    i.changeTheButton(/* you send the neccesary info from your date to your activity */); 
    dateToString(year, month, day); 
} 

그리고 마지막으로

//This is in your MainActivity, note you're imlementing the new MyInterface interface 
public class MainActivity extends Activity implements HomeFragment.OnFragmentInteractionListener, MyInterface { 
    ... 
    @Override 
    public void changeTheButton(/*The parameters you need to send form the fragment to the a 
    Activity*/){ 
    //This is where you receive the parameters from fragment, and change the button text as you need. 
    } 
} 

는 도움이되기를 바랍니다. 요청에 따라

편집

또한 설명 :

이 길 소통하는 가장 좋은 방법으로 인터페이스 생각 @JRsz.ActivityFragment의 부모이므로 Fragment의 부모이므로인스턴스에 액세스 할 수 있으므로 Fragment의 부모이므로이 메시지를 Fragment으로 쉽게 보낼 수 있습니다.

한편 Fragment에서 Activity (위로)은 Activity 인스턴스에 액세스 할 수 없기 때문에 약간 다릅니다. 그렇기 때문에 조각에 OnAttach 메서드를 사용하여 Activity 인스턴스에 액세스 할 수 있습니다.

조각을 참조 안에 인스턴스를 저장 한 다음 theParentActivity.theMethodImLookingFor(theParameters);을 호출하면 작동하지만 Fragment이 여러 활동에 첨부 될 수 있으므로 권장되지 않습니다. 상위 액티비티는 찾고있는 메소드를 가지고 있으며, 인터페이스가 생성됩니다.

찾고있는 방법을 확인하는 올바른 방법은 인터페이스입니다. 참조하는 Activity에 구현되어 있습니다. 인터페이스는 더 이상 클래스에서 구현하고 다른 클래스에서 호출하려는 메소드 목록이 아닙니다. 그래서

단계는 다음과 같습니다 1. 인터페이스 (별도의 파일) 2. 당신의 Activity의 인터페이스를 구현 3. 재정의 (즉, 힘 당신이 당신의 MainActivity에서 당신이 인터페이스에 넣어 방법을, 재정의) 만들기 FragmentonAttach 메소드를 입력하고 매개 변수로 제공된 Activity을 인터페이스로 전송하십시오. (단편에서 인터페이스 인스턴스를 전역으로 저장하십시오.) 4. OnDate을 변경 한 후 조각에서 인터페이스를 사용하여 필요한 매개 변수를 전송하십시오. (귀하의 활동에서 그 방법을 호출합니다).

명확한 지, 그것이 효과가 있는지 알려주세요.

+0

나는 아직도이 문제를 다루고 있지만, 나는 당신의 답을 완벽하게 이해하지 못한다. 어쩌면 시간이 더 필요 하겠지만 인터페이스를 통해 보내고받는 것이 정확히 어떻게 작동하는지 설명 할 수 있습니까? 나는 당신의 코드를 완전히 이해할 수있는 인터페이스에 대해 충분히 알지 못한다 ... – JRsz

+1

@JRsz 추가 설명으로 편집 됨 – unmultimedio

+0

ok, 주 활동에 날짜 보내기. 그것은 기본적으로 내가 원했던 것입니다. 나는 당신의 대답 등을 upvote 것입니다,하지만 여전히 하나의 버그가 있습니다 : 내가 너무 텍스트를 설정하려고하면, 그것은 충돌합니다. 텍스트가 String이고 Button이 대화 상자에있는 경우 이것이 문제의 원인이라고 생각합니다. Nullpointer 예외가 발생했습니다 ... 이것은 방법입니다 : http://pastebin.com/XGwEKuyK – JRsz

0

은이 방법을 수행하면 변수로 버튼을 decalare과 방법에서 모든

public class MainActivity extends Activity implements HomeFragment.OnFragmentInteractionListener 
{ 
    CreateDialogFragment createDialogFragment; 
    Button btn = new Button(); 
    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     homeFragment = new HomeFragment(); 

     fragmentManager.beginTransaction().add(R.id.mainFrame, homeFragment).commit(); 
     btn = (Button) findViewById(R.id.bottomButton_home); 
     btn..setBackgroundResource(R.drawable.ic_home); 
    } 



    public void openCreate(View view) 
    { 
     createDialogFragment = new CreateDialogFragment(); 
     createDialogFragment.show(fragmentManager, "TEST"); 

     updateSelectedButton(3); 
    } 




    public void pickDate(View v) 
    { 
     DialogFragment datePicker = new DatePickerFragment(); 
     datePicker.show(getFragmentManager(), String.format(getResources().getString(R.string.pickDate))); 

     btn.setText();//Here I am stuck 
    } 
[...] 
} 
+0

올바른 경우 컴파일러가 수행합니다. 그러나 선택한 날짜에 대한 정보는 어떻게 얻습니까? – JRsz

+0

질문하지 않았다 –

+0

datePickerPopUp에서 확인을 클릭하면 onDatePicked 메서드가 호출됩니다. 그래서 여기에 제가 가지고있는 날짜가 있습니다. 하지만 어떻게 그걸 꺼낼 수 있니? 그래서 MainActivity로 돌아가서 내가 필요로하는 곳은 ... – JRsz

관련 문제