2016-10-14 8 views
-1

フラグメントからonClickイベントを含むアクティビティのボタンにデータを渡す通信を実装するインターフェイスを使用したいと思います。 HashMapがeditTextフィールドで有効なデータを書き込むことができますが、その値をアクティビティに送ることはできません。アクティビティのonClickイベントをトリガーすると、エラーを表示して停止します。インターフェイスからフラグメントへのHashMap値の取得

私はインターフェイスの使い方を混乱させました。デバッギングを試した後、以下のようなエラーが表示され、処理に3日ほどかかることがありますが、それでも解決できません。誰もそれを解決する方法をお勧めするか、議論することができます、ありがとう。

エラー:

Error:(77, 5) error: method does not override or implement a method from a supertype 
Error:(39, 8) error: Fragment_step_2 is not abstract and does not override abstract method onPassValueStep2() in onPassValue2 
Error:(231, 32) error: method onPassValueStep1 in class Fragment_step_1 cannot be applied to given types; 
required: HashMap 
found: no arguments 
reason: actual and formal argument lists differ in length 
Error:(232, 32) error: method onPassValueStep2 in class Fragment_step_2 cannot be applied to given types; 
required: HashMap 
found: no arguments 
reason: actual and formal argument lists differ in length 
Error:(78, 5) error: method does not override or implement a method from a supertype 
Error:(36, 8) error: Fragment_step_1 is not abstract and does not override abstract method onPassValueStep1() in onPassValue 

Calling Fragments' HashMap to activity

主な活動:

public interface onPassValue{ 
    Map<Object, String> onPassValueStep1(); 
} 

public interface onPassValue2{ 
    Map<Object, String> onPassValueStep2(); 
} 

protected void onCreate(Bundle savedInstanceState) { 
    ...... 
    btn_sendInsureInfo.setOnClickListener(new View.OnClickListener(){ 
     @Override 
     public void onClick(View view){ 
      //CALL here 
      //Fragment_step_1.onPassValueStep1(); 
      //Fragment_step_2.onPassValueStep2(); 
      ...... 
     } 
} 
...... 

Fragment_step_1:

public class Fragment_step_1 extends Fragment implements xxx.onPassValue { 
    ...... 
    HashMap insureApplicant = new HashMap<>(4); 

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
} 

@Override 
public void onAttach(Context xxx){ 
    super.onAttach(xxx); 

    /*try { 
     passValue = (onPassValue) xxx; 
    } catch (ClassCastException e) { 
     throw new ClassCastException(pingan_insure_info.toString() 
       + " didn't implement onPassValue"); 
    }*/ 
} 

@Override 
public Map<Object, String> onPassValueStep1(HashMap insureResult) { 
    for (Object key : insureResult.entrySet()) { 
     //System.out.println(key + " fragment_1 : " + insureResult.get(key)); 
     System.out.println(" fragment_1 : " + key); 
     Log.e("Hashmap", String.valueOf(insureResult)); 
    } 
    return insureResult; 
} 
    ...... 

Fragment_s(xxxはアクティビティの名前です) tep_2:(xxxはアクティビティの名前です)

public class Fragment_step_2 extends Fragment implements xxx.onPassValue2{ 
...... 
RelativeLayout correspondence; 
HashMap insureApplicant2 = new HashMap<>(3); 

@Override 
public void onAttach(Context pingan_insure_info){ 
    super.onAttach(pingan_insure_info); 

    /*try { 
     passValueStep2 = (onPassValueStep2) xxx; 
    } catch (ClassCastException e) { 
     throw new ClassCastException(xxx.toString() 
       + " didn't implement onPassValue"); 
    }*/ 
} 

@Override 
public Map<Object, String> onPassValueStep2(HashMap insureApplicantStep2){ 
    for (Object key : insureApplicantStep2.entrySet()) { 
     System.out.println("fragment_2 : " + key); 
     Log.e("Hashmap2", String.valueOf(insureApplicantStep2)); 
    } 
    return insureApplicant2; 
} 

すべての断片EDITTEXTはEDITTEXTが有効と入力された後、ユーザーが充填され、関数に送信し、HashMapの中に保存されます。例えば

:(TextWatcherとAddTextChangedListener)あなたのインターフェイスのメソッドのFragment

residentAddress.addTextChangedListener(new TextWatcher() { 
     @Override 
     public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {} 

     @Override 
     public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {} 

     @Override 
     public void afterTextChanged(Editable editable) { 
      residentAddress.setOnFocusChangeListener(new View.OnFocusChangeListener(){ 
       @Override 
       public void onFocusChange(View view, boolean isFocus){ 
        if(!isFocus){ 
         if("".trim().equals(residentAddress.getText().toString())){ 
          rAddress.setError("Resident Address is required."); 
          strAddress = ""; 
          insureApplicant2.put(2, strAddress); 
         } else { 
          rAddress.setErrorEnabled(false); 
          rAddress.setError(null); 
          strAddress = residentAddress.getText().toString().trim(); 
          insureApplicant2.put(2, strAddress); 

          onPassValueStep2(insureApplicant2); 

         } 
        } 
       } 
      }); 

     } 
    }); 

答えて

0

署名が間違っています。あなたのようなインターフェースを宣言した:

public interface onPassValue{ 
    Map<Object, String> onPassValueStep1(); 
} 

public interface onPassValue2{ 
    Map<Object, String> onPassValueStep2(); 
} 

およびフラグメントには、公開

public Map<Object, String> onPassValueStep1(HashMap insureResult) { 

Map<Object, String> onPassValueStep2(HashMap insureApplicantStep2){

を持っているあなたが気づくことができるよう、あなたのインターフェイスで宣言されたメソッドがパラメータを持っていません。

あなたが欠落しているパラメータを追加し、あなたのインタフェースで、あなたのメソッドの宣言を変更したり、助けを求めFragment

+0

おかげで方法を変更することができます。私はここで不注意なミスをしました。 : ')そして、どのようにボタンのクリックでそれらのHashMap値を呼び出すことができますか? @BlackbeltアクティビティでHashMapを宣言し、getHashMapStep1.onPassValueStep1(insureApplicant)をアクティビティonClickイベントで呼び出しますか? –

+0

インターフェイスを変更する必要があります。例えば、 'Map onPassValueStep1(Map insureResult);'(これは他のものに対しても同じことをします)。 – Blackbelt

+0

アクティビティのインタフェースのインスタンスのみを変更しますか?ありがとうございました。 –

関連する問題