Slim is an annotation library whose main purpose is to remove common boilerplate associated with Android development. You can find it here on GitHub.
Features
- Assignment of ‘extras’ passed through to an Activity or Fragment
- Casting of an Activity to an interface callback within a Fragment
- Easily call through to an Activity through an interface callback
- Layout declaration at the top of the class
- Base class implementations that remove having to call through to the
Slim
methods - Pairs well with other Annotation-based libraries, such as ButterKnife
- Check out GitHub for more
Usage
@Extra
public class MyActivity extends Activity { public static final String EXTRA_DATA = "data"; @Extra(EXTRA_DATA) Data mData; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Slim.injectExtras(getIntent().getExtras(), this); }}
An exception will be thrown by default if an extra is not found. You can mark an extra as optional by setting optional = true
inside the annotation parameters. This will also allow you to set a default value:
@Extra(value = EXTRA_DATA, optional = true)Data mData = Data.newInstance();
mData
will be set to Data.newInstance()
if an extra was not found matching key EXTRA_DATA
.
@Callback
public class MyFragment extends Fragment { @Callback MyCallback mMyCallback; public void onAttach(Activity activity) { super.onAttach(activity); Slim.injectCallback(this); } public interface MyCallback { public void doStuff(); }}
This will cast the Activity
to your callback for you automatically. If the Activity
does not implement the Fragment
interface, a ClassCastException
will be thrown with an appropriate error message in the logs.
@CallbackClick
public class MyFragment extends Fragment { @Callback MyCallback mMyCallback; public void onAttach(Activity activity) { super.onAttach(activity); Slim.injectCallbacks(this); } public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); Slim.injectCallbacksMethods(this); } public interface MyCallback { @CallbackClick(R.id.do_stuff) public void doStuff(); }}
This will automatically assign a click listener from a View represented by its id to your callback’s methods. Due to limitations with Java annotations, this will only work with zero argument methods.
@Layout
@Layout(R.layout.fragment_main)public class MyFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return Slim.createLayout(getActivity(), this, container); }}
This will work anywhere you have access to a Context
.
@Layout(R.layout.list_item)public class MyAdapter extends BaseAdapter { @Override public View getView(int position, View convertView, ViewGroup parent) { View view = convertView; if(view == null) { view = Slim.createLayout(parent.getContext(), this, parent); } // ... return view; }}
Other
@Layout(R.layout.fragment_example)public class ExampleFragment extends SlimFragment { public static final String EXTRA_TEXT = "extra_text"; @Extra(EXTRA_TEXT) String mText; @Callback ExampleCallback mCallback; @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); TextView textView = (TextView) view.findViewById(R.id.text); textView.setText(mText); } public interface ExampleCallback { @CallbackClick(R.id.example_Button) public void goToNextScreen(); }}