Jak stworzyć własną klawiaturę w aplikacji?

0

Bawię się androidem ostatnio, i klawiatura systemowa, mi się trochę nie podoba. Chciałbym w programie, mieć własną klawiaturę, którą zacząłem robić.

package com.example.keyboard.app;

import android.graphics.Color;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.text.InputType;
import android.util.DisplayMetrics;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TableLayout;
import android.widget.TableRow;

public class MainActivity extends ActionBarActivity
{
    EditText et[] = new EditText[4];
    Button btn[][] = new Button[2][5];
    int tab[] = {0,0,0};
    int id_button=0;

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

        DisplayMetrics dm = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(dm);
        int width = dm.widthPixels;
        int size;
        size = ((width - 8)/5);

        TableLayout tl;
        tl = (TableLayout) findViewById(R.id.layout);

        TableRow tr[] = new TableRow[4];

        Button button = new Button(this);

        int val = 0;
        for(int i=0; i<2; i++)
        {
           tr[i] = new TableRow(this);
           tr[i].setPadding(0, 0, 0, 2);
           tl.addView(tr[i]);
           for(int j=0; j<5; j++)
           {
               int id = val++;
               btn[i][j] = new Button(this);
               btn[i][j].setBackgroundColor(Color.rgb(60, 70, 80));
               btn[i][j].setText(String.valueOf(id));
               btn[i][j].setId(id);
               final int ii=i;
               final int jj=j;
               btn[i][j].setOnClickListener(new View.OnClickListener() {
                   @Override
                   public void onClick(View view)
                   {
                        for(int licznik=0; licznik<4; licznik++)
                        {
                            if(id_button==licznik)
                            {
                                et[licznik].setText(String.valueOf(btn[ii][jj].getText()));
                            }
                        }
                   }
               });
               TableRow.LayoutParams params = new TableRow.LayoutParams();
               params.height = size;
               params.width = size;
               params.setMargins(0,0,2,0);
               btn[i][j].setLayoutParams(params);
               tr[i].addView(btn[i][j]);
           }
        }

        for(int k=0; k<4; k++)
        {
            et[k]=new EditText(this);
            et[k].setInputType(InputType.TYPE_NULL);
            final int kk =k;
            et[k].setOnTouchListener(new View.OnTouchListener()
            {
                @Override
                public boolean onTouch(View view, MotionEvent motionEvent)
                {
                    id_button=kk;
                    return false;
                }
            });
            tl.addView(et[k]);
        }
        button.setText("add");
        tl.addView(button);

        View.OnClickListener button_add = new View.OnClickListener()
        {
            @Override
            public void onClick(View view)
            {
                add();
            }
            //takie tam liczenie średniej z 3 liczb.
            private void add()
            {
                int a, b, c;
                a=b=c=0;
                double sr;
                if(et[0].getText().toString().length()!=0)
                {
                    a = Integer.parseInt(et[0].getText().toString());
                }
                if(et[1].getText().toString().length()!=0)
                {
                    b = Integer.parseInt(et[1].getText().toString());
                }
                if(et[2].getText().toString().length()!=0)
                {
                    c = Integer.parseInt(et[2].getText().toString());
                }
                sr = (double)(a+b+c)/3;
                et[3].setText(String.valueOf(sr));
            }
        };
        button.setOnClickListener(button_add);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

}

Co dalej zrobić aby po kliknięciu w pole edittext np. et[1], móc tam wpisać wartość(tylko cyfry) za pomocą buttonów. Po kliknięciu w innego edittexta powiedzmy et[2], powinna tam się znaleźć cyfra, którą wybierzemy za pomocą buttonów.

0

Może dodam zdjęcie. Będzie Wam łatwiej zrozumieć o co mi chodzi, może nie za dobrze to opisałem w temacie.
http://imgup.pl/di/C4O6/cam00010.jpg

0

Ustawiasz dla każdego przycisku onClickListener i dla każdego kliknięcia zmieniasz tekst w edittext.

0

Zrobiłem to po swojemu, ale to chyba nie jest zbyt eleganckie rozwiązanie. Do edittextów dodaję setOnTouchListenery, po kliknięciu w dany edittext, p do zmiennej globalnej id_button przypisuję id tego edittxta. Do buttonów mam ustawione setOnClickListenery, i po kliknięciu w button za pomocą zmiennej globalnej id_button wiem w którym edittexcie ma pojawić się cyfra. To chyba nie jest poprawne rozwiązanie(ale działa), martwi mnie ta zmienna globalna. W temacie dałem nowy kod.

0

Dlaczego tworzysz i dodajesz przyciski programistycznie? Nie lepiej i szybciej zrobić to xml-u? Jeżeli działa to jest ok. Patrzę na kod i szczerze mówiąc nie wiem co masz na myśli pisząc zmienna globalna.

0

Jakoś tak mam, że wolę w kodzie niż w xml. A int id_buttons, nie jest globalna? Chyba mi się mylą lokalne i globalne.

0

Jakoś tak mam, że wolę w kodzie niż w xml.

  • jeżeli piszesz projekt sam dla siebie to ok, ale jeżeli ktoś ma przejąć kod po Tobie, to lepiej doucz się xmla, chyba że chcesz kiedyś dostać maila o mało przyjemnej treści (od klienta). Id są globalne tylko w obrębie danego layoutu (zobacz jak wygląda wygenerowany plik R).
0

Uczę się i javy i xml. Ale wydaje mi się, że w moim docelowym projekcie (gra planszowa) lepiej dodawać kontrolki(nie wszystkie) w kodzie. W pętli, będę zmieniał ich kolory, i wyświetlane obrazki na imageview/ image button. W sumie mogę dodawać w xml, i potem w kodzie dodać do nich referencje.

0

A i jeszcze z jedną rzeczą się nie mogę uporać.
Kilka linijek kodu.

package com.example.board.app;

import android.graphics.Color;
import android.support.v7.appcompat.R.dimen;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.util.TypedValue;
import android.view.Gravity;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.EditText;
import android.view.View;
import android.widget.TableLayout;
import android.widget.TableRow;
import android.widget.TextView;

public class MainActivity extends ActionBarActivity
{
    int size=33;
    int textsize = 3*size/4;
    EditText tv;
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        TableLayout tl;
        tl = (TableLayout) findViewById(R.id.layout);

        TableRow tr;
        tr = (TableRow) findViewById(R.id.layout0);

        tv = new EditText(this);
        tv.setHeight(size);
        tv.setText("5");
        tv.setGravity(Gravity.CENTER);
        tv.setBackgroundColor(Color.YELLOW);
        tv.setTextSize(TypedValue.COMPLEX_UNIT_SP, textsize);
        tr.addView(tv);



    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

}

Jeden edittext, co ma wyświetlić cyfrę 5, niby nic, a problem nie do ogarnięcia. Rozmiar tekstu= 3/4 wysokości edittext, tak też to ustawiam w kodzie, a cyfra nie wyświetla się cała, tylko jej dolna połowa, w górnej części edittext(Tak jak by ją ktoś pociągnął do góry:D). Gdy edittext zamienię na textview wszystko jest w porządku wyświetla się cyfra ładnie wyśrodkowania w pionie i poziomie. Chciałbym aby text zajmował prawie całą wysokość tego edittextu.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.