In the app that I'm developing, I have a Menu with icons that is on the right and left edges of the screen, and it mantains there in all the app's activities.
What I've done is first create the "MenuView" class (wich may extend View, RelativeLayout, or something else)where are defined all the menu's icons and their onClickListeners. Then the layout for this class. In the layout I stablished 2 linearlayout's wich are each one on the border's of the screen (These refers to the menu) and a LinearLayout with the blank space inside the columns, where the other activities must go.
MenuViewActivity.java
public class MenuViewActivity extends {
public MenuViewActivity(Context context, AttributeSet attrs) {
super(context, attrs);
...
((ImageView)this.findViewById(R.id.navButton)).setOnClickListener(launch_nav);
final OnClickListener launch_nav = new OnClickListener() {
@Override
public void onClick(View v) {
getBaseContext().startActivity(new Intent(getBaseContext(), Navigation.class));
}
};
...
menu_view.xml
<RelativeLayout
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="com.example.MenuViewActivity" >
<!-- Shows custom time titlebar -->
<include
layout="@layout/custom_tittlebar" >
</include>
<!-- Button columns -->
<LinearLayout
android:id="@+id/lefthandmenu"
android:layout_width="85dip"
android:layout_height="match_parent"
android:layout_below="@id/title"
android:layout_alignParentLeft="true"
android:orientation="vertical"
android:background="@drawable/border_cut" >
<ImageView
... />
...
</LinearLayout>
<LinearLayout
android:id="@+id/righthandmenu"
android:layout_width="85dip"
android:layout_height="match_parent"
android:layout_below="@id/title"
android:layout_alignParentRight="true"
android:orientation="vertical"
android:background="@drawable/border_cut" >
<ImageView
... />
...
</LinearLayout>
<!-- Blank space which will contain other activities -->
<LinearLayout
android:id="@+id/activitycontent"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_toLeftOf="@id/righthandmenu"
android:layout_toRightOf="@id/lefthandmenu"
android:layout_below="@id/title"
android:orientation="vertical" >
</LinearLayout>
So, what I must do now is to tell the program that other activities must go inside this last layout. For this, I do this in for example the Main class. I inflate the layout.
MainClass.java
public class MainClass extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
super.onCreate(savedInstanceState);
LinearLayout inside_menu_view = (LinearLayout)findViewById(R.id.activitycontent);
View this_layout = getLayoutInflater().inflate(R.layout.main, inside_menu_view);
inside_menu_view.addView(this_layout);
But I'm getting an error on the logcat:
UPDATE - After modifications still not working, this is the LogCat
10-31 09:35:17.521: E/AndroidRuntime(1676): FATAL EXCEPTION: main
10-31 09:35:17.521: E/AndroidRuntime(1676): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example/com.example.MainClass}: android.view.InflateException: Binary XML file line #12: Error inflating class com.example.MenuViewActivity
10-31 09:35:17.521: E/AndroidRuntime(1676): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647)
10-31 09:35:17.521: E/AndroidRuntime(1676): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
10-31 09:35:17.521: E/AndroidRuntime(1676): at android.app.ActivityThread.access$1500(ActivityThread.java:117)
10-31 09:35:17.521: E/AndroidRuntime(1676): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
10-31 09:35:17.521: E/AndroidRuntime(1676): at android.os.Handler.dispatchMessage(Handler.java:99)
10-31 09:35:17.521: E/AndroidRuntime(1676): at android.os.Looper.loop(Looper.java:130)
10-31 09:35:17.521: E/AndroidRuntime(1676): at android.app.ActivityThread.main(ActivityThread.java:3683)
10-31 09:35:17.521: E/AndroidRuntime(1676): at java.lang.reflect.Method.invokeNative(Native Method)
10-31 09:35:17.521: E/AndroidRuntime(1676): at java.lang.reflect.Method.invoke(Method.java:507)
10-31 09:35:17.521: E/AndroidRuntime(1676): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
10-31 09:35:17.521: E/AndroidRuntime(1676): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
10-31 09:35:17.521: E/AndroidRuntime(1676): at dalvik.system.NativeStart.main(Native Method)
10-31 09:35:17.521: E/AndroidRuntime(1676): Caused by: android.view.InflateException: Binary XML file line #12: Error inflating class com.example.MenuViewActivity
10-31 09:35:17.521: E/AndroidRuntime(1676): at android.view.LayoutInflater.createView(LayoutInflater.java:518)
10-31 09:35:17.521: E/AndroidRuntime(1676): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:570)
10-31 09:35:17.521: E/AndroidRuntime(1676): at android.view.LayoutInflater.rInflate(LayoutInflater.java:623)
10-31 09:35:17.521: E/AndroidRuntime(1676): at android.view.LayoutInflater.inflate(LayoutInflater.java:408)
10-31 09:35:17.521: E/AndroidRuntime(1676): at android.view.LayoutInflater.inflate(LayoutInflater.java:320)
10-31 09:35:17.521: E/AndroidRuntime(1676): at android.view.LayoutInflater.inflate(LayoutInflater.java:276)
10-31 09:35:17.521: E/AndroidRuntime(1676): at com.masermic.medialauncher.LauncherActivity.onCreate(LauncherActivity.java:67)
10-31 09:35:17.521: E/AndroidRuntime(1676): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
10-31 09:35:17.521: E/AndroidRuntime(1676): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
10-31 09:35:17.521: E/AndroidRuntime(1676): ... 11 more
10-31 09:35:17.521: E/AndroidRuntime(1676): Caused by: java.lang.reflect.InvocationTargetException
10-31 09:35:17.521: E/AndroidRuntime(1676): at java.lang.reflect.Constructor.constructNative(Native Method)
10-31 09:35:17.521: E/AndroidRuntime(1676): at java.lang.reflect.Constructor.newInstance(Constructor.java:415)
10-31 09:35:17.521: E/AndroidRuntime(1676): at android.view.LayoutInflater.createView(LayoutInflater.java:505)
10-31 09:35:17.521: E/AndroidRuntime(1676): ... 19 more
10-31 09:35:17.521: E/AndroidRuntime(1676): Caused by: java.lang.NullPointerException
10-31 09:35:17.521: E/AndroidRuntime(1676): at com.mexample.MenuViewActivity.<init>(MenuViewActivity.java:55)
10-31 09:35:17.521: E/AndroidRuntime(1676): ... 22 more
you can not inflate Activity
. You can inflate View
and derived type. So, your class should extends View
, ViewGroup
or some of the derived classes.
EDIT:
Regardins your inflate exception, you are getting a NPE at line 55 of your custom view, probably because, R.id.navButton
is not declared inside the layout your a trying to inflate.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.