2016-04-17 7 views
0

私はこの解決策のために実際にstackoverflowで閲覧しました。 Imは別のフラグメントからの断片にアクセスしようとするとエラーが他のフラグメントのダイアログフラグメントを開くと、キャストエラーが発生する

java.lang.ClassCastException: com.noel.myapplication99.IncomeTax cannot be cast to com.noel.myapplication99.IncomeDialog 
     at com.noel.myapplication99.MainActivity.createOutput(MainActivity.java:119) 
     at com.noel.myapplication99.IncomeTax$1.onClick(IncomeTax.java:77) 
     at android.view.View.performClick(View.java:4785) 
     at android.view.View$PerformClick.run(View.java:19869) 
     at android.os.Handler.handleCallback(Handler.java:739) 
     at android.os.Handler.dispatchMessage(Handler.java:95) 
     at android.os.Looper.loop(Looper.java:155) 
     at android.app.ActivityThread.main(ActivityThread.java:5696) 
     at java.lang.reflect.Method.invoke(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:372) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1028) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:823) 

は、これらは私のコードであることを MainActivity.java

public class MainActivity extends AppCompatActivity 
     implements IncomeTax.OnFragmentInteractionListener, ResidentialIncomeTax.OnFragmentInteractionListener, NavigationDrawerFragment.NavigationDrawerCallbacks, IncomeTax.IncomeTaxListener { 


    public void onFragmentInteraction(Uri uri){ 
    } 
    private NavigationDrawerFragment mNavigationDrawerFragment; 

    private CharSequence mTitle; 


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


     mNavigationDrawerFragment = (NavigationDrawerFragment) 
       getSupportFragmentManager().findFragmentById(R.id.navigation_drawer); 
     mTitle = getTitle(); 

     // Set up the drawer. 
     mNavigationDrawerFragment.setUp(
       R.id.navigation_drawer, 
       (DrawerLayout) findViewById(R.id.drawer_layout)); 

    } 

    @Override 
    public void onNavigationDrawerItemSelected(int position) { 
     // update the main content by replacing fragments 
     Fragment fragment=null; 
     switch(position) 
     { 
      case 0: 
       fragment = new IncomeTax(); 
       mTitle = getString(R.string.title_section1); 
       break; 
      case 1: 
       fragment = new ResidentialIncomeTax(); 
       mTitle = getString(R.string.title_section2); 
       break; 
     } 

     if(fragment!=null) 

     { 
      FragmentManager fragmentManager = getSupportFragmentManager(); 
      fragmentManager.beginTransaction().replace(R.id.container, fragment, "Tag").commit(); 
     } 
    } 



    public void onSectionAttached(int number) { 
     switch (number) { 

     } 
    } 

    public void restoreActionBar() { 
     ActionBar actionBar = getSupportActionBar(); 
     actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD); 
     actionBar.setDisplayShowTitleEnabled(true); 
     actionBar.setTitle(mTitle); 
    } 


    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     if (!mNavigationDrawerFragment.isDrawerOpen()) { 
      getMenuInflater().inflate(R.menu.main, menu); 
      restoreActionBar(); 
      return true; 
     } 
     return super.onCreateOptionsMenu(menu); 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     int id = item.getItemId(); 

     if (id == R.id.action_settings) { 
      return true; 
     } 

     return super.onOptionsItemSelected(item); 
    } 

    @Override 
    public void createOutput(int i, int f) { 
     IncomeDialog incomeDialog = (IncomeDialog) getSupportFragmentManager().findFragmentByTag("Tag"); 
     incomeDialog.setOutputText(i, f); 
    } 

    public static class PlaceholderFragment extends Fragment { 
     private static final String ARG_SECTION_NUMBER = "section_number"; 
     public static PlaceholderFragment newInstance(int sectionNumber) { 
      PlaceholderFragment fragment = new PlaceholderFragment(); 
      Bundle args = new Bundle(); 
      args.putInt(ARG_SECTION_NUMBER, sectionNumber); 
      fragment.setArguments(args); 
      return fragment; 
     } 

     public PlaceholderFragment() { 
     } 

     @Override 
     public void onAttach(Activity activity) { 
      super.onAttach(activity); 
      ((MainActivity) activity).onSectionAttached(
        getArguments().getInt(ARG_SECTION_NUMBER)); 
     } 
    } 

} 

IncomeTax.java

public class IncomeTax extends Fragment implements AdapterView.OnItemSelectedListener { 

IncomeTaxListener activityCommander; 
float selectedIncomeType; 

public interface IncomeTaxListener{ 
    public void createOutput(int i, int f); 
} 

@Override 
public void onAttach(Context context) { 
    super.onAttach(context); 
    try{ 
     activityCommander = (IncomeTaxListener) context; 
    }catch(Exception e){ 
     throw new ClassCastException(toString()); 
    } 
} 

private OnFragmentInteractionListener mListener; 
public IncomeTax() { 
    // Required empty public constructor 
} 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    if (getArguments() != null) { 

    } 
} 

Button btnIcCalc; 
EditText salary, insuaranceRelief; 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 
    View view = inflater.inflate(R.layout.fragment_income_tax, container, false); 
    salary = (EditText) view.findViewById(R.id.tvSalary); 
    insuaranceRelief = (EditText) view.findViewById(R.id.tvReliefCalc); 
    btnIcCalc = (Button)view.findViewById(R.id.btnIcCalc); 


    final int iSalary=0; 
    final int iInsuranceRelief=1; 

    btnIcCalc.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      //Dialog box here 
      activityCommander.createOutput(iSalary, iInsuranceRelief); 
      FragmentManager manager = getActivity().getSupportFragmentManager(); 
      IncomeDialog myDialog = new IncomeDialog(); 
      myDialog.setTargetFragment(IncomeTax.this, 0); 
      myDialog.show(manager, "IncomeDialog"); 
     } 
    }); 


    setSpinnerContent(view); 
    return view; 
} 


private void setSpinnerContent(View view) 
{ 

    Spinner spinner = (Spinner) view.findViewById(R.id.incomeTypeSpinner); 
    ArrayAdapter incomeSpinnerArrayAdapter = ArrayAdapter.createFromResource(this.getActivity(), R.array.income_type_array, android.R.layout.simple_spinner_item); 

    spinner.setAdapter(incomeSpinnerArrayAdapter); 
    spinner.setOnItemSelectedListener(this); 
} 



@Override 
public void onAttach(Activity activity) { 
    super.onAttach(activity); 
    try { 
     mListener = (OnFragmentInteractionListener) activity; 
    } catch (ClassCastException e) { 
     throw new ClassCastException(activity.toString() 
       + " must implement OnFragmentInteractionListener"); 
    } 
} 

@Override 
public void onDetach() { 
    super.onDetach(); 
    mListener = null; 
} 

@Override 
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { 
    switch (position){ 
     case 0: 
      selectedIncomeType = 1; 

     break; 
     case 1: 
      selectedIncomeType = 1; 
     break; 
    } 

} 

@Override 
public void onNothingSelected(AdapterView<?> parent) { 

} 
スローされます

収入Dialog.java

public class IncomeDialog extends DialogFragment { 

public IncomeDialog() { 
    // Required empty public constructor 
} 

TextView netPay, insuranceRelief; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 
    View view = inflater.inflate(R.layout.fragment_income_dialog, null); 
    netPay = (TextView) view.findViewById(R.id.tvNetPay); 
    insuranceRelief = (TextView) view.findViewById(R.id.tvPersonalRelief); 
    return view; 

} 
public void setOutputText(int i, int f){ 
    netPay.setText(i); 
    insuranceRelief.setText(f); 

} 
+0

あなたは何をここで達成しようとしている、ところでIncomeDialog' –

+0

'に' IncomeTax'をキャストしようとしているので? @Override public void createOutput(int i、int f){ IncomeDialog incomeDialog =(IncomeDialog)getSupportFragmentManager()。findFragmentByTag( "タグ"); incomeDialog.setOutputText(i、f); } ' –

+0

ImomeDialogフラグメントに出力を送信しようとしています –

答えて

0

あなたは、このようにしてみてください、その後DialogFragmetにデータを送信する場合:

Bundle bundle = new Bundle(); 
bundle.putInt("key1", i); 
bundle.putInt("key2", f); 
IncomeDialog incomeDialog = new IncomeDialog(); 
incomeDialog.setArguments(bundle); 

今、このincomeDialogを追加するFragmentTransactionを行っています。ダイアログが表示されます。 IncomeDialogにバンドルデータを受信するように

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 
    View view = inflater.inflate(R.layout.fragment_income_dialog, null); 
    netPay = (TextView) view.findViewById(R.id.tvNetPay); 
    insuranceRelief = (TextView) view.findViewById(R.id.tvPersonalRelief); 

    Bundle bundle=getArguments(); 
    int i = bundle.getInt("key1"); 
    int f = bundle.getInt("key2"); 

    return view; 
} 
+0

ありがとうございました....しかし、文字列型のデータを送信しようとすると、putIntで動作しません。 –

+0

'int'ではなく' String'を送信しているので、 'putString'を使用してください。 –

関連する問題