-1

http://www.itechcode.com/2012/03/18/create-calculator-in-android-programming/

私は彼のソースコードを使用していますが、新しいプロジェクトの作成、レイアウトの変更、main.javaでの参照など、これまで使用してきた「初心者レベル」のプログラミングとは大きく異なるようです。

私は彼のソースコードを使用して、新しい操作を変更/作成し、おそらくアクティビティを追加しようとしています。レイアウトが異なっていなければ、私は通常、そのようなことのほとんどを行う方法を知っています。ありがとう!

    package com.pragmatouch.calculator;

    import java.text.DecimalFormat;
    import java.text.NumberFormat;
    import java.util.Iterator;
    import java.util.Stack;

    import android.app.Activity;
    import android.os.Bundle;
    import android.widget.AdapterView;
    import android.widget.Button;
    import android.widget.TextView;
    import android.widget.AdapterView.OnItemClickListener;
    import android.widget.GridView;
    import android.view.View;
    import android.view.View.OnClickListener;

    public class main extends Activity {
        GridView mKeypadGrid;
        TextView userInputText;
        TextView memoryStatText;

        Stack<String> mInputStack;
        Stack<String> mOperationStack;

        KeypadAdapter mKeypadAdapter;
        TextView mStackText;
        boolean resetInput = false;
        boolean hasFinalResult = false;

        String mDecimalSeperator;
        double memoryValue = Double.NaN;

        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);

            DecimalFormat currencyFormatter = (DecimalFormat) NumberFormat
                    .getInstance();
            char decimalSeperator = currencyFormatter.getDecimalFormatSymbols()
                    .getDecimalSeparator();
            mDecimalSeperator = Character.toString(decimalSeperator);

            setContentView(R.layout.main);

            // Create the stack
            mInputStack = new Stack<String>();
            mOperationStack = new Stack<String>();

            // Get reference to the keypad button GridView
            mKeypadGrid = (GridView) findViewById(R.id.grdButtons);

            // Get reference to the user input TextView
            userInputText = (TextView) findViewById(R.id.txtInput);
            userInputText.setText("0");

            memoryStatText = (TextView) findViewById(R.id.txtMemory);
            memoryStatText.setText("");

            mStackText = (TextView) findViewById(R.id.txtStack);

            // Create Keypad Adapter
            mKeypadAdapter = new KeypadAdapter(this);

            // Set adapter of the keypad grid
            mKeypadGrid.setAdapter(mKeypadAdapter);

            // Set button click listener of the keypad adapter
            mKeypadAdapter.setOnButtonClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    Button btn = (Button) v;


                    // Get the KeypadButton value which is used to identify the
                    // keypad button from the Button's tag
                    KeypadButton keypadButton = (KeypadButton) btn.getTag();

                    // Process keypad button
                    ProcessKeypadInput(keypadButton);
                }
            });

            mKeypadGrid.setOnItemClickListener(new OnItemClickListener() {
                public void onItemClick(AdapterView<?> parent, View v,
                        int position, long id) {

                }
            });

        }

        private void ProcessKeypadInput(KeypadButton keypadButton) {
            //Toast.makeText(this, keypadButton.getText(), Toast.LENGTH_SHORT).show();
            String text = keypadButton.getText().toString();
            String currentInput = userInputText.getText().toString();

            int currentInputLen = currentInput.length();
            String evalResult = null;
            double userInputValue = Double.NaN;

            switch (keypadButton) {
            case BACKSPACE: // Handle backspace
                // If has operand skip backspace
                if (resetInput)
                    return;

                int endIndex = currentInputLen - 1;

                // There is one character at input so reset input to 0
                if (endIndex < 1) {
                    userInputText.setText("0");
                }
                // Trim last character of the input text
                else {
                    userInputText.setText(currentInput.subSequence(0, endIndex));
                }
                break;
            case SIGN: // Handle -/+ sign
                // input has text and is different than initial value 0
                if (currentInputLen > 0 && currentInput != "0") {
                    // Already has (-) sign. Remove that sign
                    if (currentInput.charAt(0) == '-') {
                        userInputText.setText(currentInput.subSequence(1,
                                currentInputLen));
                    }
                    // Prepend (-) sign
                    else {
                        userInputText.setText("-" + currentInput.toString());
                    }
                }
                break;
            case CE: // Handle clear input
                userInputText.setText("0");
                break;
            case C: // Handle clear input and stack
                userInputText.setText("0");
                clearStacks();
                break;
            case DECIMAL_SEP: // Handle decimal seperator
                if (hasFinalResult || resetInput) {
                    userInputText.setText("0" + mDecimalSeperator);
                    hasFinalResult = false;
                    resetInput = false;
                } else if (currentInput.contains("."))
                    return;
                else
                    userInputText.append(mDecimalSeperator);
                break;
            case DIV:
            case PLUS:
            case MINUS:
            case MULTIPLY:
                if (resetInput) {
                    mInputStack.pop();
                    mOperationStack.pop();
                } else {
                    if (currentInput.charAt(0) == '-') {
                        mInputStack.add("(" + currentInput + ")");
                    } else {
                        mInputStack.add(currentInput);
                    }
                    mOperationStack.add(currentInput);
                }

                mInputStack.add(text);
                mOperationStack.add(text);

                dumpInputStack();
                evalResult = evaluateResult(false);
                if (evalResult != null)
                    userInputText.setText(evalResult);

                resetInput = true;
                break;
            case CALCULATE:
                if (mOperationStack.size() == 0)
                    break;

                mOperationStack.add(currentInput);
                evalResult = evaluateResult(true);
                if (evalResult != null) {
                    clearStacks();
                    userInputText.setText(evalResult);
                    resetInput = false;
                    hasFinalResult = true;
                }
                break;
            case M_ADD: // Add user input value to memory buffer
                userInputValue = tryParseUserInput();
                if (Double.isNaN(userInputValue))
                    return;
                if (Double.isNaN(memoryValue))
                    memoryValue = 0;
                memoryValue += userInputValue;
                displayMemoryStat();

                hasFinalResult = true;

                break;
            case M_REMOVE: // Subtract user input value to memory buffer
                userInputValue = tryParseUserInput();
                if (Double.isNaN(userInputValue))
                    return;
                if (Double.isNaN(memoryValue))
                    memoryValue = 0;
                memoryValue -= userInputValue;
                displayMemoryStat();
                hasFinalResult = true;
                break;
            case MC: // Reset memory buffer to 0
                memoryValue = Double.NaN;
                displayMemoryStat();
                break;
            case MR: // Read memoryBuffer value
                if (Double.isNaN(memoryValue))
                    return;
                userInputText.setText(doubleToString(memoryValue));
                displayMemoryStat();
                break;
            case MS: // Set memoryBuffer value to user input
                userInputValue = tryParseUserInput();
                if (Double.isNaN(userInputValue))
                    return;
                memoryValue = userInputValue;
                displayMemoryStat();
                hasFinalResult = true;
                break;
            case PRGM: 
            break;
            default:
                if (Character.isDigit(text.charAt(0))) {
                    if (currentInput.equals("0") || resetInput || hasFinalResult) {
                        userInputText.setText(text);
                        resetInput = false;
                        hasFinalResult = false;
                    } else {
                        userInputText.append(text);
                        resetInput = false;
                    }

                }
                break;

            }

        }

        private void clearStacks() {
            mInputStack.clear();
            mOperationStack.clear();
            mStackText.setText("");
        }

        private void dumpInputStack() {
            Iterator<String> it = mInputStack.iterator();
            StringBuilder sb = new StringBuilder();

            while (it.hasNext()) {
                CharSequence iValue = it.next();
                sb.append(iValue);

            }

            mStackText.setText(sb.toString());
        }

        private String evaluateResult(boolean requestedByUser) {
            if ((!requestedByUser && mOperationStack.size() != 4)
                    || (requestedByUser && mOperationStack.size() != 3))
                return null;

            String left = mOperationStack.get(0);
            String operator = mOperationStack.get(1);
            String right = mOperationStack.get(2);
            String tmp = null;
            if (!requestedByUser)
                tmp = mOperationStack.get(3);

            double leftVal = Double.parseDouble(left.toString());
            double rightVal = Double.parseDouble(right.toString());
            double result = Double.NaN;

            if (operator.equals(KeypadButton.DIV.getText())) {
                result = leftVal / rightVal;
            } else if (operator.equals(KeypadButton.MULTIPLY.getText())) {
                result = leftVal * rightVal;

            } else if (operator.equals(KeypadButton.PLUS.getText())) {
                result = leftVal + rightVal;
            } else if (operator.equals(KeypadButton.MINUS.getText())) {
                result = leftVal - rightVal;

            }

            String resultStr = doubleToString(result);
            if (resultStr == null)
                return null;

            mOperationStack.clear();
            if (!requestedByUser) {
                mOperationStack.add(resultStr);
                mOperationStack.add(tmp);
            }

            return resultStr;
        }

        private String doubleToString(double value) {
            if (Double.isNaN(value))
                return null;

            long longVal = (long) value;
            if (longVal == value)
                return Long.toString(longVal);
            else
                return Double.toString(value);

        }

        private double tryParseUserInput() {
            String inputStr = userInputText.getText().toString();
            double result = Double.NaN;
            try {
                result = Double.parseDouble(inputStr);

            } catch (NumberFormatException nfe) {
            }
            return result;

        }

        private void displayMemoryStat() {
            if (Double.isNaN(memoryValue)) {
                memoryStatText.setText("");
            } else {
                memoryStatText.setText("M = " + doubleToString(memoryValue));
            }
        }

    }

ENUM:

package com.pragmatouch.calculator;

public enum KeypadButton {
    MC("MC",KeypadButtonCategory.MEMORYBUFFER)
    , MR("MR",KeypadButtonCategory.MEMORYBUFFER)
    , MS("MS",KeypadButtonCategory.MEMORYBUFFER)
    , M_ADD("M+",KeypadButtonCategory.MEMORYBUFFER)
    , M_REMOVE("M-",KeypadButtonCategory.MEMORYBUFFER)
    , BACKSPACE("<-",KeypadButtonCategory.CLEAR)
    , CE("CE",KeypadButtonCategory.CLEAR)
    , C("C",KeypadButtonCategory.CLEAR)
    , ZERO("0",KeypadButtonCategory.NUMBER)
    , ONE("1",KeypadButtonCategory.NUMBER)
    , TWO("2",KeypadButtonCategory.NUMBER)
    , THREE("3",KeypadButtonCategory.NUMBER)
    , FOUR("4",KeypadButtonCategory.NUMBER)
    , FIVE("5",KeypadButtonCategory.NUMBER)
    , SIX("6",KeypadButtonCategory.NUMBER)
    , SEVEN("7",KeypadButtonCategory.NUMBER)
    , EIGHT("8",KeypadButtonCategory.NUMBER)
    , NINE("9",KeypadButtonCategory.NUMBER)
    , PLUS(" + ",KeypadButtonCategory.OPERATOR)
    , MINUS(" - ",KeypadButtonCategory.OPERATOR)
    , MULTIPLY(" * ",KeypadButtonCategory.OPERATOR)
    , DIV(" / ",KeypadButtonCategory.OPERATOR)
    , RECIPROC("1/x",KeypadButtonCategory.OTHER)
    , DECIMAL_SEP(",",KeypadButtonCategory.OTHER)
    , SIGN("±",KeypadButtonCategory.OTHER)
    , SQRT("SQRT",KeypadButtonCategory.OTHER)
    , PERCENT("%",KeypadButtonCategory.OTHER)
    , CALCULATE("=",KeypadButtonCategory.RESULT)
    , PRGM("PRGM",KeypadButtonCategory.PRGM)
    , DUMMY("",KeypadButtonCategory.DUMMY);

    CharSequence mText; // Display Text
    KeypadButtonCategory mCategory;

    KeypadButton(CharSequence text,KeypadButtonCategory category) {
        mText = text;
        mCategory = category;
    }

    public CharSequence getText() {
        return mText;
    }
}

パッケージcom.pragmatouch.calculator;

public enum KeypadButtonCategory {
    MEMORYBUFFER
    , NUMBER
    , OPERATOR
    , DUMMY
    , CLEAR
    , RESULT
    , OTHER
    , PRGM
}
4

1 に答える 1

1

私はあなたに素晴らしい答えを持っています。最近、Androidで独自のボタンを作成したかったのですが、簡単な方法でやりたかったのです。これらの手順に従ってください。数分で写真を投稿できます。

1) 新しいレイアウトを作成します。で始まりLinearLayoutます。その中にaFramedLayoutと別のものを入れ子LinearLayoutにします。

2) 次に、a を追加TextViewします。これは、練習が完璧になるところです。属性をいじってみましょう。彼らが何をしているかを学びましょう。ボタンの表示方法に関する一般的な情報が得られたら、次のステップに進みます。

3) これから行うことは、これを別のビューにボタンとして含めることです。特定の属性を使用して、ボタンのように見せることもできます。

数分お待ちください。コードと画像を投稿します。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/CBN_LinearLayout"
style="@android:style/Widget.Button"
android:layout_width="match_parent"
android:layout_height="50dp"
android:orientation="vertical" >

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <TextView
        android:id="@+id/CBV_texview1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:layout_marginRight="10dp"
        android:layout_weight="1"
        android:gravity="right"
        android:text="@string/checkorder"
        android:textColor="@color/Black" />

    <FrameLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:layout_weight="1" >

        <ImageView
            android:id="@+id/CBV_imageView1"
            android:layout_width="23dp"
            android:layout_height="15dp"
            android:layout_gravity="center_vertical"
            android:contentDescription="@string/redcirclenotify"
            android:src="@drawable/rednotify"
            android:visibility="visible" />

        <TextView
            android:id="@+id/CBV_textview2"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:layout_marginLeft="8dp"
            android:gravity="left"
            android:text="@string/zero"
            android:visibility="visible" />

    </FrameLayout>
</LinearLayout>

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content" >

    <TextView
        android:id="@+id/CBV_textview3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:fadingEdge="horizontal"
        android:gravity="center_horizontal"
        android:text="@string/blankstring" />

    <TextView
        android:id="@+id/CBV_textview4"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:gravity="center_horizontal"
        android:text="@string/blankstring" />
</LinearLayout>

使用するボタンとして別のビューに追加する場合:

<include
        android:id="@+id/MI_checkorder"
        style="android:buttonStyle"
        android:layout_width="wrap_content"
        android:layout_height="50dp"
        android:layout_gravity="bottom"
        android:layout_marginTop="5dp"
        android:layout_weight="1"
        layout="@layout/custombtnview"
        android:background="@style/AppTheme"
        android:clickable="true"
        android:focusable="true" />

これの重要な部分は、ルートのスタイルを次のように設定するLinearLayoutことです@android:style/Widget.Button

これが完了すると、ボタンのように見え、ボタンのように機能します。

以下は最終製品のイメージです。

カスタム Android ボタン

あなたの質問の別の部分。Android の標準ボタンのサイズを調整します。

1) XML を使用する方法でほとんどすべてを制御できます。これはすべて、ADK の右側の領域で制御できます。これらの属性は、ほぼすべての側面を制御するのに役立ちます。

たとえば、電卓のように...

1 行に 4 つのボタンがあるため、水平方向の内側に 4 つのボタンを追加しますLinearLayout。次に、各ボタンに 1 の重みを与えてから、それらWidthを に設定できますFillParent。これにより、ボタンが画面の幅に均等に表示されるように自動サイズ調整されます。

独自の計算式を作成するか、既存のコードを変更する方がよいでしょうか?

ホイールを再作成するように誰かに言うことは決してありませんが、中断したところからピックアップするのに十分なほどコードを理解していない場合、これは困難な苦労になる可能性があります. 与えられたコードやその変更方法を理解するのに問題がある場合の最善の策は、実際に別の質問にコードを投稿し、非常に具体的にして、たとえば、この特定のボタンが表示するものと表示されるものを変更するにはどうすればよいかを尋ねることです。クリックした結果になります。このフォーラムは、人々が質問を明確かつ簡潔にすることにかかっています。そうでない場合、質問は開かれるとすぐに閉じられます。一般化は、サイト上でひどく嫌われています。

最終的に、私がやろうとしていることは、独自の関数電卓を作成することですが、単純な操作に余分な時間を費やしたくありません。

これに答える最善の方法は、電卓が GUI またはグラフィカル レイアウトでどのように組み立てられているかを調べることです。ボタンとその機能を変更してみてください。たとえば、学習曲線のためだけにプラスをマイナスにします。

1) を探して, PLUS(" + ",KeypadButtonCategory.OPERATOR)、プラスの文字列であることを確認します。「 T 」に変更して、アプリで変更されるかどうかを確認します。そうであれば、コードに入ります。コードではcase CALCULATE:、 for の = 記号が見つかりENUM、その中にevalResult = evaluateResult(true);. これに従うと、次のようになります。

if (operator.equals(KeypadButton.DIV.getText())) {
            result = leftVal / rightVal;
        } else if (operator.equals(KeypadButton.MULTIPLY.getText())) {
            result = leftVal * rightVal;

        } else if (operator.equals(KeypadButton.PLUS.getText())) {
            result = leftVal + rightVal;
        } else if (operator.equals(KeypadButton.MINUS.getText())) {
            result = leftVal - rightVal;

        }

これで変更できます。変更result = leftVal + rightVal;result = leftVal - rightVal;たばかりです。コードを理解するには時間がかかりますが、理解するには試行錯誤が必要です。これがあなたの質問に答えるのに役立つことを願っています.

于 2013-03-03T18:29:33.983 に答える