2016-09-20 6 views
1

:) Ich begann eine App mit Tabs und Fragmente zu tun, aber in den Klassen Fragmente, wenn OnClick auf Schaltflächen Hinzufügen nichts passiert, wenn Sie die TasteKnopf OnClick in einem Fragment

gedrückt wird dort ist fragment_sub_page02.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
tools:context="layout.SubPage02"> 
<Button 
    android:id="@+id/button" 

    android:layout_width="300dp" 
    android:layout_height="wrap_content" 
    android:layout_alignParentLeft="true" 
    android:layout_margin="8dp" 
    android:text="Button" 
    /> 

und das ist SubPage02.java:

public class SubPage02 extends Fragment { 
// TODO: Rename parameter arguments, choose names that match 
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER 
private static final String ARG_PARAM1 = "param1"; 
private static final String ARG_PARAM2 = "param2"; 
Button mbutton; 

// TODO: Rename and change types of parameters 
private String mParam1; 
private String mParam2; 

private OnFragmentInteractionListener mListener; 

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

/** 
* Use this factory method to create a new instance of 
* this fragment using the provided parameters. 
* 
* @param param1 Parameter 1. 
* @param param2 Parameter 2. 
* @return A new instance of fragment SubPage02. 
*/ 
// TODO: Rename and change types and number of parameters 
public static SubPage02 newInstance(String param1, String param2) { 
    SubPage02 fragment = new SubPage02(); 
    Bundle args = new Bundle(); 
    args.putString(ARG_PARAM1, param1); 
    args.putString(ARG_PARAM2, param2); 
    fragment.setArguments(args); 
    return fragment; 
} 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    if (getArguments() != null) { 
     mParam1 = getArguments().getString(ARG_PARAM1); 
     mParam2 = getArguments().getString(ARG_PARAM2); 
    } 
} 

public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 

    if (container == null) { 
     return null; 
    } 

    LinearLayout mLinearLayout = (LinearLayout) inflater.inflate(R.layout.fragment_sub_page02, 
      container, false); 

    // note that we're looking for a button with id="@+id/myButton" in your inflated layout 
    // Naturally, this can be any View; it doesn't have to be a button 
    Button mButton = (Button) mLinearLayout.findViewById(R.id.button); 
    mButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      // here you set what you want to do when user clicks your button, 
      // e.g. launch a new activity 
     } 
    }); 

    // after you've done all your manipulation, return your layout to be shown 
    return mLinearLayout; 
} 

@Override 
public void onAttach(Context context) { 
    super.onAttach(context); 
    if (context instanceof OnFragmentInteractionListener) { 
     mListener = (OnFragmentInteractionListener) context; 
    } else { 
     throw new RuntimeException(context.toString() 
       + " must implement OnFragmentInteractionListener"); 
    } 
} 

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

/** 
* This interface must be implemented by activities that contain this 
* fragment to allow an interaction in this fragment to be communicated 
* to the activity and potentially other fragments contained in that 
* activity. 
* <p> 
* See the Android Training lesson <a href= 
* "http://developer.android.com/training/basics/fragments/communicating.html" 
* >Communicating with Other Fragments</a> for more information. 
*/ 
public interface OnFragmentInteractionListener { 
    // TODO: Update argument type and name 
    void onFragmentInteraction(Uri uri); 
} 

Nach Eingabe mehrerer Dinge in den onclick und nichts passierte ... Wo sollte ich die Funktion der Taste ...?

Danke an alle! :)

EDIT 1 (MainActivity.java):

import java.util.zip.Inflater; 
public class MainActivity extends AppCompatActivity { 

private SectionsPagerAdapter mSectionsPagerAdapter; 
private ViewPager mViewPager; 
public FloatingActionButton fab; 

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

    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 
    // Create the adapter that will return a fragment for each of the three 
    // primary sections of the activity. 
    mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager()); 

    // Set up the ViewPager with the sections adapter. 
    mViewPager = (ViewPager) findViewById(R.id.container); 
    mViewPager.setAdapter(mSectionsPagerAdapter); 

    TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs); 
    tabLayout.setupWithViewPager(mViewPager); 


    tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { 
     @Override 
     public void onTabSelected(TabLayout.Tab tab) { 
      mViewPager.setCurrentItem(tab.getPosition()); 
      animateFab(tab.getPosition()); 
     } 

     @Override 
     public void onTabUnselected(TabLayout.Tab tab) { 

     } 

     @Override 
     public void onTabReselected(TabLayout.Tab tab) { 

     } 
    }); 


} 
public static class PlaceholderFragment extends Fragment { 

    private static final String ARG_SECTION_NUMBER = "section_number"; 


    public PlaceholderFragment() { 
    } 

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

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     if (getArguments().getInt(ARG_SECTION_NUMBER) == 2) { 
      View rootView = inflater.inflate(R.layout.fragment_blank, container, false); 
      return rootView; 
     } else if (getArguments().getInt(ARG_SECTION_NUMBER) == 1) { 
      View rootView = inflater.inflate(R.layout.fragment_sub_page02, container, false); 
      return rootView; 
     } else { 
      View rootView = inflater.inflate(R.layout.fragment_main, container, false); 
      return rootView; 
     } 
    } 
} 

public class SectionsPagerAdapter extends FragmentPagerAdapter { 

    public SectionsPagerAdapter(FragmentManager fm) { 
     super(fm); 
    } 

    @Override 
    public Fragment getItem(int position) { 
     // getItem is called to instantiate the fragment for the given page. 
     // Return a PlaceholderFragment (defined as a static inner class below). 
     return PlaceholderFragment.newInstance(position + 1); 
    } 

    @Override 
    public int getCount() { 
     // Show 3 total pages. 
     return 3; 
    } 

    @Override 
    public CharSequence getPageTitle(int position) { 
     switch (position) { 
      case 0: 
       return "AlertDialog"; 
      case 1: 
       return "Toast"; 
      case 2: 
       return "Snackbar"; 
     } 
     return null; 

    } 


} 
+0

was wollen Sie auf die Schaltfläche tun klicken? , und Sie machen den richtigen Weg, indem Sie die onClick-Methode implementieren. –

+1

'Nachdem Sie mehrere Dinge in den Onclick eingegeben haben und nichts passiert ist, was haben Sie versucht? – njzk2

+0

Ich setzte 'Toast.makeText (getView(). GetApplicationContext, R.string.ToastText, Toast.LENGTH_LONG) .show();' 'startActivityForResult (neue Absicht (Settings.ACTION_LOCALE_SETTINGS), 0);' 'Snackbar snackbar1 = Snackbar.make (getView(). GetApplicationContext, R..string.SnackBarText, Snackbar.LENGTH_LONG); snackbar1.show(); ' –

Antwort

1

Ihre TabLayout erfordert eine neue Instanz von PlaceholderFragment jedes Mal, wenn eine neue Seite ausgewählt wird, so lassen Sie sich an seinem onCreateView() einen genaueren Blick:

Je nach dem Wert von getArguments().getInt(ARG_SECTION_NUMBER) wird ein spezifisches Layout aufgeblasen. Wenn der Wert 1 ist, ist das Layout dasselbe wie für SubPage02.

Aber das bedeutet nicht, dass eine Instanz von SubPage02 erstellt wird, sie haben zufällig die gleiche Layoutdatei gemeinsam.

So hat die OnClickListener im onCreateView() von PlaceholderFragment eingestellt werden:

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    if (getArguments().getInt(ARG_SECTION_NUMBER) == 2) { 
     View rootView = inflater.inflate(R.layout.fragment_blank, container, false); 
     return rootView; 
    } else if (getArguments().getInt(ARG_SECTION_NUMBER) == 1) { 
     View rootView = inflater.inflate(R.layout.fragment_sub_page02, container, false); 

     Button mButton = (Button) rootView.findViewById(R.id.button); 
     mButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       // here you set what you want to do when user clicks your button, 

      } 
     }); 

     return rootView; 
    } else { 
     View rootView = inflater.inflate(R.layout.fragment_main, container, false); 
     return rootView; 
    } 
} 
+0

Vielen Dank! :) Gelöst ein Problem unter einer Woche nervenaufreibenden Versuch und Fehler ... :) Prost –

+0

Aber nur etwas zu fragen, was ist das Fragment Java für dann? Wenn ich die Klasse des Fragments gelöscht habe, hat sich nichts geändert ... Ist es notwendig, es zu haben? –

+1

@ValentinFilyov - Sie brauchen es nicht für Ihre Architektur. Ich denke, einige Leute möchten vielleicht verschiedene Fragmente von 'PlaceholderFragment # newInstance()', z. eine Instanz von 'SubPage02' für den Wert 1. Wenn Sie es so machen, würde 'onCreateView()' von PlaceholderFragment trotzdem aufgerufen, also müssten Sie bestimmen, in welche Klasse Sie schreiben und dann etwas wie das folgende schreiben: '((SubPage02) this) .onCreateView (inflater, container, savedInstanceState)'. Dann würde die Child-Class-Methode aufgerufen werden ... aber ich muss sagen, ich bin nicht wirklich sicher, ob dieser Ansatz eine gute Idee ist. – 0X0nosugar

0

Die id Sie waren auf der Suche ist myButton und Sie schrieb button. Auch XML-Layout fragment_sub_page02. Zum Aufblasen versuchen Sie die getLayoutInflater().

View view = getLayoutInflater().inflate(R.layout.fragment_sub_page02, 
     container, false); 

// note that we're looking for a button with id="@+id/myButton" in your inflated layout 
// Naturally, this can be any View; it doesn't have to be a button 
Button mButton = (Button) view.findViewById(R.id.myButton); 
mButton.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     // here you set what you want to do when user clicks your button, 
     // e.g. launch a new activity 
    } 
}); 

// after you've done all your manipulation, return your layout to be shown 
return view; 

Lassen Sie mich wissen, wenn geholfen.

+0

Die ID meines Buttons lautet 'button' und fragt nach Bundle in den' getLayoutInflater's Klammern: D –

Verwandte Themen