Note that there are some explanatory texts on larger screens.

plurals
  1. POAndroid Homescreen
    primarykey
    data
    text
    <p>Hey folks, this is my first post so go easy on me!</p> <p>I want to develop an application where you can navigate through 7 or so screens like you can on the homescreen.</p> <p>I have seen a few posts on this but I can't seem to get them to work, I also can't seem to add comments to them (I'm sure thats me being a noob)</p> <p>So I need a working project so I can look at it and dissect it and use the bits relevant to me. </p> <p>This one was of interest but I just can't get it to work. I use Eclipse and the SDK is that what everyone else uses?</p> <p><a href="https://stackoverflow.com/questions/3467461/developing-an-android-homescreen">Developing an Android Homescreen</a></p> <p>When I implement it I need to tell the app how to start because it installs it but says there is no activity.</p> <p>hope you can help</p> <p>T</p> <p>What I have in my Main.Java</p> <pre><code>package com.matthieu.launcher; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.ViewFlipper; public class main extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Button onebutton = (Button)findViewById(R.id.soundsone); onebutton.setOnClickListener(new OnClickListener() { public void onClick(View v) { Intent i = new Intent(main.this, series1button.class); startActivity(i); overridePendingTransition(R.anim.push_up_in, R.anim.push_up_out); } }); Button twobutton = (Button)findViewById(R.id.soundstwo); twobutton.setOnClickListener(new OnClickListener() { public void onClick(View v) { Intent i = new Intent(main.this, series2button.class); startActivity(i); overridePendingTransition(R.anim.push_up_in, R.anim.push_up_out); } }); Button threebutton = (Button)findViewById(R.id.soundsthree); threebutton.setOnClickListener(new OnClickListener() { public void onClick(View v) { Intent i = new Intent(main.this, series3button.class); startActivity(i); overridePendingTransition(R.anim.push_up_in, R.anim.push_up_out); } }); Button fourbutton = (Button)findViewById(R.id.soundsfour); fourbutton.setOnClickListener(new OnClickListener() { public void onClick(View v) { Intent i = new Intent(main.this, series4button.class); startActivity(i); overridePendingTransition(R.anim.push_up_in, R.anim.push_up_out); } }); Button fivebutton = (Button)findViewById(R.id.soundsfive); fivebutton.setOnClickListener(new OnClickListener() { public void onClick(View v) { Intent i = new Intent(main.this, series5button.class); startActivity(i); overridePendingTransition(R.anim.push_up_in, R.anim.push_up_out); } }); Button sixbutton = (Button)findViewById(R.id.soundssix); sixbutton.setOnClickListener(new OnClickListener() { public void onClick(View v) { Intent i = new Intent(main.this, series6button.class); startActivity(i); overridePendingTransition(R.anim.push_up_in, R.anim.push_up_out); } }); Button sevenbutton = (Button)findViewById(R.id.soundsseven); sevenbutton.setOnClickListener(new OnClickListener() { public void onClick(View v) { Intent i = new Intent(main.this, series7button.class); startActivity(i); overridePendingTransition(R.anim.push_up_in, R.anim.push_up_out); } }); Button eightbutton = (Button)findViewById(R.id.soundseight); eightbutton.setOnClickListener(new OnClickListener() { public void onClick(View v) { Intent i = new Intent(main.this, series8button.class); startActivity(i); overridePendingTransition(R.anim.push_up_in, R.anim.push_up_out); } }); } } </code></pre> <p>Then Dragablespace.java</p> <pre><code>package com.matthieu.launcher; import android.content.Context; import android.app.Activity; import android.util.Log; import android.content.res.TypedArray; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.VelocityTracker; import android.view.View; import android.view.ViewGroup; import android.view.ViewConfiguration; import android.widget.Scroller; public class DragableSpace extends ViewGroup { private Scroller mScroller; private VelocityTracker mVelocityTracker; private int mScrollX = 0; private int mCurrentScreen = 0; private float mLastMotionX; private static final String LOG_TAG = "DragableSpace"; private static final int SNAP_VELOCITY = 1000; private final static int TOUCH_STATE_REST = 0; private final static int TOUCH_STATE_SCROLLING = 1; private int mTouchState = TOUCH_STATE_REST; private int mTouchSlop = 0; public DragableSpace(Context context) { super(context); mScroller = new Scroller(context); mTouchSlop = ViewConfiguration.get(getContext()).getScaledTouchSlop(); this.setLayoutParams(new ViewGroup.LayoutParams( ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.FILL_PARENT)); } public DragableSpace(Context context, AttributeSet attrs) { super(context, attrs); mScroller = new Scroller(context); mTouchSlop = ViewConfiguration.get(getContext()).getScaledTouchSlop(); this.setLayoutParams(new ViewGroup.LayoutParams( ViewGroup.LayoutParams.WRAP_CONTENT , ViewGroup.LayoutParams.FILL_PARENT)); TypedArray a=getContext().obtainStyledAttributes(attrs,R.styleable.DragableSpace); mCurrentScreen = a.getInteger(R.styleable.DragableSpace_default_screen, 0); } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { /* * This method JUST determines whether we want to intercept the motion. * If we return true, onTouchEvent will be called and we do the actual * scrolling there. */ /* * Shortcut the most recurring case: the user is in the dragging state * and he is moving his finger. We want to intercept this motion. */ final int action = ev.getAction(); if ((action == MotionEvent.ACTION_MOVE) &amp;&amp; (mTouchState != TOUCH_STATE_REST)) { return true; } final float x = ev.getX(); switch (action) { case MotionEvent.ACTION_MOVE: /* * mIsBeingDragged == false, otherwise the shortcut would have caught it. Check * whether the user has moved far enough from his original down touch. */ /* * Locally do absolute value. mLastMotionX is set to the y value * of the down event. */ final int xDiff = (int) Math.abs(x - mLastMotionX); boolean xMoved = xDiff &gt; mTouchSlop; if (xMoved) { // Scroll if the user moved far enough along the X axis mTouchState = TOUCH_STATE_SCROLLING; } break; case MotionEvent.ACTION_DOWN: // Remember location of down touch mLastMotionX = x; /* * If being flinged and user touches the screen, initiate drag; * otherwise don't. mScroller.isFinished should be false when * being flinged. */ mTouchState = mScroller.isFinished() ? TOUCH_STATE_REST : TOUCH_STATE_SCROLLING; break; case MotionEvent.ACTION_CANCEL: case MotionEvent.ACTION_UP: // Release the drag mTouchState = TOUCH_STATE_REST; break; } /* * The only time we want to intercept motion events is if we are in the * drag mode. */ return mTouchState != TOUCH_STATE_REST; } @Override public boolean onTouchEvent(MotionEvent event) { if (mVelocityTracker == null) { mVelocityTracker = VelocityTracker.obtain(); } mVelocityTracker.addMovement(event); final int action = event.getAction(); final float x = event.getX(); switch (action) { case MotionEvent.ACTION_DOWN: Log.i(LOG_TAG, "event : down"); /* * If being flinged and user touches, stop the fling. isFinished * will be false if being flinged. */ if (!mScroller.isFinished()) { mScroller.abortAnimation(); } // Remember where the motion event started mLastMotionX = x; break; case MotionEvent.ACTION_MOVE: // Log.i(LOG_TAG,"event : move"); // if (mTouchState == TOUCH_STATE_SCROLLING) { // Scroll to follow the motion event final int deltaX = (int) (mLastMotionX - x); mLastMotionX = x; //Log.i(LOG_TAG, "event : move, deltaX " + deltaX + ", mScrollX " + mScrollX); if (deltaX &lt; 0) { if (mScrollX &gt; 0) { scrollBy(Math.max(-mScrollX, deltaX), 0); } } else if (deltaX &gt; 0) { final int availableToScroll = getChildAt(getChildCount() - 1) .getRight() - mScrollX - getWidth(); if (availableToScroll &gt; 0) { scrollBy(Math.min(availableToScroll, deltaX), 0); } } // } break; case MotionEvent.ACTION_UP: Log.i(LOG_TAG, "event : up"); // if (mTouchState == TOUCH_STATE_SCROLLING) { final VelocityTracker velocityTracker = mVelocityTracker; velocityTracker.computeCurrentVelocity(1000); int velocityX = (int) velocityTracker.getXVelocity(); if (velocityX &gt; SNAP_VELOCITY &amp;&amp; mCurrentScreen &gt; 0) { // Fling hard enough to move left snapToScreen(mCurrentScreen - 1); } else if (velocityX &lt; -SNAP_VELOCITY &amp;&amp; mCurrentScreen &lt; getChildCount() - 1) { // Fling hard enough to move right snapToScreen(mCurrentScreen + 1); } else { snapToDestination(); } if (mVelocityTracker != null) { mVelocityTracker.recycle(); mVelocityTracker = null; } // } mTouchState = TOUCH_STATE_REST; break; case MotionEvent.ACTION_CANCEL: Log.i(LOG_TAG, "event : cancel"); mTouchState = TOUCH_STATE_REST; } mScrollX = this.getScrollX(); return true; } private void snapToDestination() { final int screenWidth = getWidth(); final int whichScreen = (mScrollX + (screenWidth / 2)) / screenWidth; Log.i(LOG_TAG, "from des"); snapToScreen(whichScreen); } public void snapToScreen(int whichScreen) { Log.i(LOG_TAG, "snap To Screen " + whichScreen); mCurrentScreen = whichScreen; final int newX = whichScreen * getWidth(); final int delta = newX - mScrollX; mScroller.startScroll(mScrollX, 0, delta, 0, Math.abs(delta) * 2); invalidate(); } public void setToScreen(int whichScreen) { Log.i(LOG_TAG, "set To Screen " + whichScreen); mCurrentScreen = whichScreen; final int newX = whichScreen * getWidth(); mScroller.startScroll(newX, 0, 0, 0, 10); invalidate(); } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { int childLeft = 0; final int count = getChildCount(); for (int i = 0; i &lt; count; i++) { final View child = getChildAt(i); if (child.getVisibility() != View.GONE) { final int childWidth = child.getMeasuredWidth(); child.layout(childLeft, 0, childLeft + childWidth, child .getMeasuredHeight()); childLeft += childWidth; } } } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); final int width = MeasureSpec.getSize(widthMeasureSpec); final int widthMode = MeasureSpec.getMode(widthMeasureSpec); if (widthMode != MeasureSpec.EXACTLY) { throw new IllegalStateException("error mode."); } final int heightMode = MeasureSpec.getMode(heightMeasureSpec); if (heightMode != MeasureSpec.EXACTLY) { throw new IllegalStateException("error mode."); } // The children are given the same width and height as the workspace final int count = getChildCount(); for (int i = 0; i &lt; count; i++) { getChildAt(i).measure(widthMeasureSpec, heightMeasureSpec); } Log.i(LOG_TAG, "moving to screen "+mCurrentScreen); scrollTo(mCurrentScreen * width, 0); } @Override public void computeScroll() { if (mScroller.computeScrollOffset()) { mScrollX = mScroller.getCurrX(); scrollTo(mScrollX, 0); postInvalidate(); } } } </code></pre> <p>Then my main.xml layout</p> <pre><code>&lt;?xml version="1.0" encoding="utf-8"?&gt; &lt;com.matthieu.launcher.DragableSpace xmlns:app="http://schemas.android.com/apk/res/com.matthieu.launcher" xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/space" android:layout_width="fill_parent" android:layout_height="fill_parent" app:default_screen="1"&gt; &lt;include android:id="@+id/left" layout="@layout/left_screen" /&gt; &lt;include android:id="@+id/center" layout="@layout/initial_screen" /&gt; &lt;include android:id="@+id/right" layout="@layout/right_screen" /&gt; &lt;/com.matthieu.launcher.DragableSpace&gt; </code></pre> <p>I also have 3 other layout files called initial, left and right(_screen)</p>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload