how can I disable the changable TextView and click on it reenable the button?

让人想犯罪 __ 提交于 2020-01-07 05:42:09

问题


Hey I have a button keyboards with green picture if the user press on it disable it(red color) and print it on the text view I have 4 textview so step by step the 4 text view fill the last textview doesn't stand and it's own number its changes every time I press on another enable number how can i disable this and I want when I click on every textview to delete the number in it and reenable the number that was in it and for example i choose second txt2 and i cleared it by click on it by pressing on a number goes automatically on the second textview take a look at the picture

Button b1;
Button b2;
Button b3;
Button b4;
Button b5;
Button b6;
Button b7;
Button b8;
Button b9;
Button b0;
Button ent;
Button clr;
String[] values = new String[]{" ", " ", " ", " "};
TextView textView[] = new TextView[4];
int size = 0;

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

    textView[0] = (TextView) findViewById(R.id.text_1);
    textView[1] = (TextView) findViewById(R.id.text_2);
    textView[2] = (TextView) findViewById(R.id.text_3);
    textView[3] = (TextView) findViewById(R.id.text_4);



    b1 = (Button) findViewById(R.id.button_1);
    b2 = (Button) findViewById(R.id.button_2);
    b3 = (Button) findViewById(R.id.button_3);
    b4 = (Button) findViewById(R.id.button_4);
    b5 = (Button) findViewById(R.id.button_5);
    b6 = (Button) findViewById(R.id.button_6);
    b7 = (Button) findViewById(R.id.button_7);
    b8 = (Button) findViewById(R.id.button_8);
    b9 = (Button) findViewById(R.id.button_9);
    b0 = (Button) findViewById(R.id.button_0);
    ent = (Button) findViewById(R.id.button_enter);
    clr = (Button) findViewById(R.id.button_clear);
    buttonEffect(b0);
    buttonEffect(b1);
    buttonEffect(b2);
    buttonEffect(b3);
    buttonEffect(b4);
    buttonEffect(b5);
    buttonEffect(b6);
    buttonEffect(b7);
    buttonEffect(b8);
    buttonEffect(b9);
    buttonEffect(clr);
    buttonEffect(ent);

}




public void onClick(View v) {
    switch (v.getId()) {
        case R.id.button_0:
            setText(0);
            b0.setBackgroundDrawable(getResources().getDrawable(R.drawable.redww));
            b0.setEnabled(false);

            break;
        case R.id.button_1:

            setText(1);
            b1.setBackgroundDrawable(getResources().getDrawable(R.drawable.redww));
            b1.setEnabled(false);

            break;
        case R.id.button_2:
            setText(2);
            b2.setBackgroundDrawable(getResources().getDrawable(R.drawable.redww));
            b2.setEnabled(false);

            break;
        case R.id.button_3:
            setText(3);
            b3.setBackgroundDrawable(getResources().getDrawable(R.drawable.redww));
            b3.setEnabled(false);

            break;
        case R.id.button_4:
            setText(4);
            b4.setBackgroundDrawable(getResources().getDrawable(R.drawable.redww));
            b4.setEnabled(false);

            break;
        case R.id.button_5:
            setText(5);
            b5.setBackgroundDrawable(getResources().getDrawable(R.drawable.redww));
            b5.setEnabled(false);

            break;
        case R.id.button_6:
            setText(6);
            b6.setBackgroundDrawable(getResources().getDrawable(R.drawable.redww));
            b6.setEnabled(false);

            break;
        case R.id.button_7:
            setText(7);
            b7.setBackgroundDrawable(getResources().getDrawable(R.drawable.redww));
            b7.setEnabled(false);

            break;
        case R.id.button_8:
            setText(8);
            b8.setBackgroundDrawable(getResources().getDrawable(R.drawable.redww));
            b8.setEnabled(false);

            break;


        case R.id.button_9:
            setText(9);
            b9.setBackgroundDrawable(getResources().getDrawable(R.drawable.redww));
            b9.setEnabled(false);

            break;
        case R.id.button_clear:
            if (size == 0) {
                return;
            }
            String numberToCleared = values[size - 1];
            clearButton(Integer.parseInt(numberToCleared));
            size--;
            values[size] = " ";
            bindText();
            break;
        case R.id.button_enter:
            break;
    }
}

private void clearButton(int number) {
    switch (number) {
        case 0 : b0.setBackgroundDrawable(getResources().getDrawable(R.drawable.greenww));
            b0.setEnabled(true);
            break;
        case 1 : b1.setBackgroundDrawable(getResources().getDrawable(R.drawable.greenww));
            b1.setEnabled(true);

            break;
        case 2 : b2.setBackgroundDrawable(getResources().getDrawable(R.drawable.greenww));
            b2.setEnabled(true);

            break;
        case 3 : b3.setBackgroundDrawable(getResources().getDrawable(R.drawable.greenww));
            b3.setEnabled(true);

            break;
        case 4 : b4.setBackgroundDrawable(getResources().getDrawable(R.drawable.greenww));
            b4.setEnabled(true);

            break;
        case 5 : b5.setBackgroundDrawable(getResources().getDrawable(R.drawable.greenww));
            b5.setEnabled(true);

            break;
        case 6 : b6.setBackgroundDrawable(getResources().getDrawable(R.drawable.greenww));
            b6.setEnabled(true);

            break;
        case 7 : b7.setBackgroundDrawable(getResources().getDrawable(R.drawable.greenww));
            b7.setEnabled(true);

            break;
        case 8 : b8.setBackgroundDrawable(getResources().getDrawable(R.drawable.greenww));
            b8.setEnabled(true);

            break;

        case 9 : b9.setBackgroundDrawable(getResources().getDrawable(R.drawable.greenww));
            b9.setEnabled(true);

            break;
    }
}

public void bindText() {
    for (int i = 0; i < 4; i++) {
        textView[i].setText(values[i]);
    }

}

public void setText(int number) {
    if (size == 4) {
        clearButton(Integer.parseInt(values[3]));
        size--;
    }
    values[size] = String.valueOf(number);
    size++;
    bindText();
}



public static void buttonEffect(View button){
    button.setOnTouchListener(new View.OnTouchListener() {

        public boolean onTouch(View v, MotionEvent event) {
            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN: {
                    v.getBackground().setColorFilter(0xe0ffffff, PorterDuff.Mode.SRC_ATOP);
                    v.invalidate();
                    break;
                }

                case MotionEvent.ACTION_UP: {
                    v.getBackground().clearColorFilter();
                    v.invalidate();
                    break;
                }
            }

            return false;
        }
    });



}

xml

     <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin">



<LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="450dp"
    android:gravity="bottom"
    android:orientation="vertical"
    android:focusable="true"
    android:focusableInTouchMode="true"
    android:id="@+id/linearLayout"
    android:weightSum="1"
    android:layout_alignParentBottom="true"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true">


    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="3dp"
        android:orientation="horizontal">

        <Button
            android:id="@+id/button_1"
            android:onClick="onClick"
            android:layout_width="wrap_content"
            android:layout_height="150dp"
            android:layout_weight="1"
            android:minHeight="80dp"
            android:background="@drawable/button_selector"
            android:text="1"
            android:textColor="#333"
            android:textSize="25sp" />

        <Button
            android:id="@+id/button_2"
            android:onClick="onClick"
            android:background="@drawable/button_selector"

            android:layout_width="wrap_content"
            android:layout_height="150dp"
            android:layout_marginLeft="2dp"
            android:layout_weight="1"
            android:minHeight="80dp"
            android:text="2"
            android:textColor="#333"
            android:textSize="25sp" />

        <Button
            android:id="@+id/button_3"
            android:onClick="onClick"
            android:background="@drawable/button_selector"

            android:layout_width="wrap_content"
            android:layout_height="150dp"
            android:layout_marginLeft="2dp"
            android:layout_marginRight="2dp"
            android:layout_weight="1"
            android:minHeight="80dp"
            android:text="3"
            android:textColor="#333"
            android:textSize="25sp" />

        <Button
            android:layout_width="wrap_content"
            android:layout_height="150dp"
            android:layout_weight="1"
            android:background="#112"
            android:minHeight="80dp"
            android:text="clear"
            android:onClick="onClick"

            android:textColor="@color/colorPrimaryDark"
            android:textSize="25sp"
            android:textStyle="bold"
            android:id="@+id/button_clear" />
    </LinearLayout>


    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="2dp"
        android:orientation="horizontal">

        <Button
            android:id="@+id/button_4"
            android:onClick="onClick"
            android:background="@drawable/button_selector"
            android:layout_width="wrap_content"
            android:layout_height="150dp"
            android:layout_weight="1"
            android:minHeight="80dp"
            android:text="4"
            android:textColor="#333"
            android:textSize="25sp" />

        <Button
            android:id="@+id/button_5"
            android:onClick="onClick"
            android:background="@drawable/button_selector"
            android:layout_width="wrap_content"
            android:layout_height="150dp"
            android:layout_marginLeft="2dp"
            android:layout_weight="1"
            android:minHeight="80dp"
            android:text="5"
            android:textColor="#333"
            android:textSize="25sp" />

        <Button
            android:id="@+id/button_6"
            android:onClick="onClick"
            android:background="@drawable/button_selector"
            android:layout_width="wrap_content"
            android:layout_height="150dp"
            android:layout_marginLeft="2dp"
            android:layout_marginRight="2dp"
            android:layout_weight="1"
            android:minHeight="80dp"
            android:text="6"
            android:textColor="#333"
            android:textSize="25sp" />

        <Button
            android:id="@+id/button_enter"
            android:layout_width="wrap_content"
            android:layout_height="150dp"
            android:layout_weight="1"
            android:background="#ccc"
            android:minHeight="80dp"
            android:text="enter"
            android:onClick="onClick"
            android:textColor="@color/colorPrimaryDark"
            android:textSize="25sp"
            android:textStyle="bold" />
    </LinearLayout>


    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="2dp"
        android:orientation="horizontal"
        android:layout_weight="0.40">

        <Button
            android:id="@+id/button_7"
            android:onClick="onClick"
            android:background="@drawable/button_selector"
            android:layout_width="wrap_content"
            android:layout_height="150dp"
            android:layout_weight="1"
            android:minHeight="80dp"
            android:text="7"
            android:textColor="#333"
            android:textSize="25sp" />

        <Button
            android:id="@+id/button_8"
            android:onClick="onClick"
            android:background="@drawable/button_selector"
            android:layout_width="wrap_content"
            android:layout_height="150dp"
            android:layout_marginLeft="2dp"
            android:layout_weight="1"
            android:minHeight="80dp"
            android:text="8"
            android:textColor="#333"
            android:textSize="25sp" />

        <Button
            android:id="@+id/button_9"
            android:onClick="onClick"
            android:background="@drawable/button_selector"
            android:layout_width="wrap_content"
            android:layout_height="150dp"
            android:layout_marginLeft="2dp"
            android:layout_marginRight="2dp"
            android:layout_weight="1"
            android:minHeight="80dp"
            android:text="9"
            android:textColor="#333"
            android:textSize="25sp" />

        <Button
            android:id="@+id/button_0"
            android:onClick="onClick"
            android:background="@drawable/button_selector"
            android:layout_width="wrap_content"
            android:layout_height="150dp"
            android:layout_marginLeft="2dp"
            android:layout_weight="1"
            android:minHeight="80dp"
            android:text="0"
            android:textColor="#333"
            android:textSize="25sp" />

    </LinearLayout>

</LinearLayout>

<LinearLayout
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:weightSum="4"

    android:layout_alignParentTop="true"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true">

    <TextView
        android:id="@+id/text_1"
        android:layout_width="0dp"
        android:layout_height="150dp"
        android:gravity="center"
        android:textSize="50dp"
        android:freezesText="true"
        android:background="@drawable/greenww"
        android:layout_weight="1"/>

    <TextView
        android:id="@+id/text_2"
        android:layout_width="0dp"
        android:layout_height="150dp"
        android:gravity="center"
        android:background="@drawable/greenww"
        android:layout_weight="1"
        android:textSize="50dp"
        android:freezesText="true"
        android:layout_marginRight="5dp"
        android:layout_marginLeft="5dp"/>
    <TextView
        android:id="@+id/text_3"
        android:layout_width="0dp"
        android:layout_height="150dp"
        android:background="@drawable/greenww"
        android:gravity="center"
        android:layout_weight="1"
        android:textSize="50dp"
        android:freezesText="true"

        android:layout_marginRight="5dp"/>
    <TextView
        android:id="@+id/text_4"
        android:layout_width="0dp"
        android:background="@drawable/greenww"
        android:layout_height="150dp"
        android:gravity="center"
        android:textSize="50dp"
        android:freezesText="true"
        android:layout_weight="1"/>


</LinearLayout>


回答1:


Sparse...Arrays are very useful because they can act as a kind of Map while avoiding autoboxing if you're working with primitive data types. For further information regarding available methods, please take a look at the reference.

The following code uses SparseIntArray in two places: for Buttons, we want to map the resource id to the number of each Button.

For TextViews, we need to keep track of their state: are they filled, and if so, with which number? So we use a SparseIntArray only for filled TextViews. The indices from textView are the keys and the numbers are the values.

The Activity will handle clicks on Buttons as well as TextViews. The values array is no longer necessary, the same goes for size.

So here's the entire Activity code - enjoy :)

private static final String EMPTY = " ";

private TextView textView[] = new TextView[4];

private SparseIntArray mapOfButtons,  // map id to number
        mapOfFilledTextViews;         // map array index to value if TextView is filled

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

    initMaps();

    textView[0] = (TextView) findViewById(R.id.text_1);
    textView[1] = (TextView) findViewById(R.id.text_2);
    textView[2] = (TextView) findViewById(R.id.text_3);
    textView[3] = (TextView) findViewById(R.id.text_4);

    for (TextView tv: textView)
    {
        tv.setOnClickListener(this);
    }

    Button b1 = (Button) findViewById(R.id.button_1);
    Button b2 = (Button) findViewById(R.id.button_2);
    Button b3 = (Button) findViewById(R.id.button_3);
    Button b4 = (Button) findViewById(R.id.button_4);
    Button b5 = (Button) findViewById(R.id.button_5);
    Button b6 = (Button) findViewById(R.id.button_6);
    Button b7 = (Button) findViewById(R.id.button_7);
    Button b8 = (Button) findViewById(R.id.button_8);
    Button b9 = (Button) findViewById(R.id.button_9);
    Button b0 = (Button) findViewById(R.id.button_0);
    Button ent = (Button) findViewById(R.id.button_enter);
    Button clr = (Button) findViewById(R.id.button_clear);

    buttonEffect(b0);
    buttonEffect(b1);
    buttonEffect(b2);
    buttonEffect(b3);
    buttonEffect(b4);
    buttonEffect(b5);
    buttonEffect(b6);
    buttonEffect(b7);
    buttonEffect(b8);
    buttonEffect(b9);
    buttonEffect(clr);
    buttonEffect(ent);
}

@Override
public void onClick(View v)
{
    int id = v.getId();

    if (v instanceof Button)
    {
        if (mapOfButtons.indexOfKey(id) < 0)
        { // so this is no number button
            if (id == R.id.button_clear)
            {
                if (mapOfFilledTextViews.size() == 0)
                {
                    return;
                }
                // get the key = the index for 'textView'
                int indexToClear = indexOfRightmostFilledTextView();
                // get the value
                int numberToClear = mapOfFilledTextViews.get(indexToClear);
                clearButton(numberToClear);
                clearTextView(indexToClear);
                bindText();
            }
            else if (id == R.id.button_enter)
            {
                // do something
            }
        }
        else // this is a number button
        {
            // only accept clicks if there is a free TextView
            if (mapOfFilledTextViews.size() == textView.length)
            {
                Toast.makeText(this,
           "First clear one of the selected numbers", Toast.LENGTH_SHORT).show();
                return;
            }
            Button b = (Button)v;
            b.setBackgroundResource(R.drawable.redww);
            b.setEnabled(false);

            int number = mapOfButtons.get(id);
            setText(number);
        }

    }
    else if (v instanceof TextView)
    {
        TextView tv = (TextView)v;
        int number = Integer.parseInt(tv.getText().toString() );
        // 'indexOfValue()' will work because we don't have duplicate values
        int i = mapOfFilledTextViews.indexOfValue(number);
        int key = mapOfFilledTextViews.keyAt(i);
        clearButton(number);
        clearTextView(key);
        bindText();
    }
}

private static void buttonEffect(View button)
{
    button.setOnTouchListener(new View.OnTouchListener()
    {

        public boolean onTouch(View v, MotionEvent event)
        {
            switch (event.getAction())
            {
                case MotionEvent.ACTION_DOWN:
                {
                    v.getBackground().setColorFilter(0xe0ffffff, PorterDuff.Mode.SRC_ATOP);
                    v.invalidate();
                    break;
                }

                case MotionEvent.ACTION_UP:
                {
                    v.getBackground().clearColorFilter();
                    v.invalidate();
                    break;
                }
            }

            return false;
        }
    });
}

private void initMaps()
{
    // empty in the beginning:
    mapOfFilledTextViews = new SparseIntArray(4);

    mapOfButtons = new SparseIntArray(10);
    mapOfButtons.put(R.id.button_0, 0);
    mapOfButtons.put(R.id.button_1, 1);
    mapOfButtons.put(R.id.button_2, 2);
    mapOfButtons.put(R.id.button_3, 3);
    mapOfButtons.put(R.id.button_4, 4);
    mapOfButtons.put(R.id.button_5, 5);
    mapOfButtons.put(R.id.button_6, 6);
    mapOfButtons.put(R.id.button_7, 7);
    mapOfButtons.put(R.id.button_8, 8);
    mapOfButtons.put(R.id.button_9, 9);
}

private void bindText()
{
    int value;
    int len = textView.length;
    for (int i = 0; i < len; i++)
    {
        value = mapOfFilledTextViews.get(i, -1);
        textView[i].setText(value >= 0 ? String.valueOf(value) : EMPTY);
    }
}

private void setText(int number)
{
    if (mapOfFilledTextViews.size() >= textView.length)
    {
        // this should not happen if we check the number
        // of free TextViews in onClick()
        return;
    }

    int index = indexOfLowestFreeTextView();
    mapOfFilledTextViews.put(index, number);
    bindText();
}

private void clearButton(int number)
{
    // get the first (in our case only) index with valueAt(index) == number
    int index = mapOfButtons.indexOfValue(number);

    if (index < 0) // this value does not exist
    {
        // this should not happen!
        // so maybe throw a RuntimeException
        return;
    }

    int id = mapOfButtons.keyAt(index);
    Button b = (Button) findViewById(id);
    b.setBackgroundResource(R.drawable.greenww);
    b.setEnabled(true);
}

private void clearTextView(int index)
{
    // remove entry as this TextView is no longer filled
    mapOfFilledTextViews.delete(index);
}

/**
 *
 * @return index (for use with 'textView') if there are filled TextViews, else -1
 */
private int indexOfRightmostFilledTextView()
{
    int size = mapOfFilledTextViews.size();
    int maxKey = -1;
    for (int i = 0; i < size; i++)
    {
        int iTemp = mapOfFilledTextViews.keyAt(i);
        if (iTemp > maxKey )
        {
            maxKey = iTemp;
        }
    }
    return maxKey;
}

/**
 * Get index of leftmost (lowest) free TextView
 * @return index for use with 'textView'. 
 * If all TextViews are filled, return textView.length
 */
private int indexOfLowestFreeTextView()
{
    int lowestIndex = textView.length;
    // this assumes the TextViews are sorted from left to right in the textView array
    for (int key = 0; key < textView.length; key++)
    {
        if (mapOfFilledTextViews.indexOfKey(key) < 0)
        {
            lowestIndex = key;
            break;
        }
    }
    return lowestIndex;
}


来源:https://stackoverflow.com/questions/39959517/how-can-i-disable-the-changable-textview-and-click-on-it-reenable-the-button

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!