1

어제부터 이것을 검색 중입니다. 많은 액티비티에 사용자 이름과 로그인을 표시하는 코드가 있습니다. 나는 모든 액티비티에 레이아웃의 코드를 복사하여 붙여 넣기를 원치 않지만 .NET에서 사용자 컨트롤과 같은 것을 원한다. 사용자 지정 컨트롤에 대한 많은 주제를 읽었거나 이해할 수 없거나이 옵션을 사용하지 못할 수도 있습니다 (해당 옵션에서 belive를 사용하지 마십시오)Android 사용자 정의 컨트롤이 가능합니까?

+0

명확하게 당신이 원하는 무슨 말을! ! 왜냐하면 해답은 .NET의 사용자 컨트롤을 모르기 때문일 수 있습니다. –

답변

6

예 가능합니다. 이 샘플을보십시오. 사용자 지정 숫자 키보드 또는 사용자 지정보기 또는 사용자 지정 사용자 지정 컨트롤입니다. 그것을 사용자 정의하고 자신의 사용자 컨트롤을 만들 : view_numeric_keyboard.xml로

import java.util.ArrayList; 

import org.mabna.order.R; 

import android.app.Activity; 
import android.content.Context; 
import android.text.InputType; 
import android.util.AttributeSet; 
import android.view.LayoutInflater; 
import android.view.MotionEvent; 
import android.view.View; 
import android.view.View.OnTouchListener; 
import android.view.ViewGroup; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.ImageButton; 
import android.widget.LinearLayout; 

// this NumericKeyboard works only for EditTexts which 
// have a tag with "usesNumericKeyboard" key and value of "true" 
// use tag with "ignoreMeForNumericKeyboardTouchListener" key and 
// value "true" for controls you do not want to set its touchListener 
public class NumericKeyboard extends LinearLayout implements OnTouchListener { 

    private View mainView = null; 
    private EditText currentEditText; 
    private Button btn0; 
    private Button btn1; 
    private Button btn2; 
    private Button btn3; 
    private Button btn4; 
    private Button btn5; 
    private Button btn6; 
    private Button btn7; 
    private Button btn8; 
    private Button btn9; 
    private ImageButton btnBackSpace; 
    private ImageButton btnDeleteAll; 

    public NumericKeyboard(Context context) { 
     super(context); 
    } 

    public NumericKeyboard(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    protected void initialize() { 
     LayoutInflater layoutInflater = (LayoutInflater) getContext() 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     View view = layoutInflater 
       .inflate(R.layout.view_numeric_keyboard, this); 

     btn0 = (Button) view.findViewById(R.id.btn0); 
     btn1 = (Button) view.findViewById(R.id.btn1); 
     btn2 = (Button) view.findViewById(R.id.btn2); 
     btn3 = (Button) view.findViewById(R.id.btn3); 
     btn4 = (Button) view.findViewById(R.id.btn4); 
     btn5 = (Button) view.findViewById(R.id.btn5); 
     btn6 = (Button) view.findViewById(R.id.btn6); 
     btn7 = (Button) view.findViewById(R.id.btn7); 
     btn8 = (Button) view.findViewById(R.id.btn8); 
     btn9 = (Button) view.findViewById(R.id.btn9); 
     btnBackSpace = (ImageButton) view.findViewById(R.id.btnBackSpace); 
     btnDeleteAll = (ImageButton) view.findViewById(R.id.btnDeleteAll); 

     btn0.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       editCurrentText(v, "0"); 
      } 
     }); 
     btn1.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       editCurrentText(v, "1"); 
      } 
     }); 
     btn2.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       editCurrentText(v, "2"); 
      } 
     }); 
     btn3.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       editCurrentText(v, "3"); 
      } 
     }); 
     btn4.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       editCurrentText(v, "4"); 
      } 
     }); 
     btn5.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       editCurrentText(v, "5"); 
      } 
     }); 
     btn6.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       editCurrentText(v, "6"); 
      } 
     }); 
     btn7.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       editCurrentText(v, "7"); 
      } 
     }); 
     btn8.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       editCurrentText(v, "8"); 
      } 
     }); 
     btn9.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       editCurrentText(v, "9"); 
      } 
     }); 
     btnBackSpace.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       editCurrentText(v, "<"); 
      } 
     }); 
     btnDeleteAll.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       editCurrentText(v, "D"); 
      } 
     }); 

     if (mainView == null && !this.isInEditMode()) { 
      setTouchListenerForChildViews(); 
      this.setVisibility(GONE); 
     } 
    } 

    protected void editCurrentText(View v, String character) { 
     if (currentEditText != null) { 
      if (character.compareTo("<") == 0) { 
       String text = currentEditText.getText().toString(); 
       if (text.length() == 0) { 
       } else if (text.length() == 1) { 
        currentEditText.setText(""); 
       } else { 
        text = text.substring(0, text.length() - 1); 
        currentEditText.setText(text); 
       } 
      } else if (character.compareTo("D") == 0) { 
       currentEditText.setText(""); 
      } else { 
       String text = currentEditText.getText().toString(); 
       text += character; 
       currentEditText.setText(text); 
      } 
     } 
    } 

    // @Override 
    // protected void onLayout(boolean changed, int l, int t, int r, int b) { 
    // 
    // super.onLayout(changed, l, t, r, b); 
    // } 

    public void setTouchListenerForChildViews() { 
     final Activity act = (Activity) getContext(); 
     mainView = act.getWindow().getDecorView() 
       .findViewById(android.R.id.content); 

     if (mainView == null) 
      return; 

     ArrayList<View> queue = new ArrayList<View>(); 
     queue.add((View) mainView); 

     while (!queue.isEmpty()) { 
      View v = queue.remove(0); 
      if (v instanceof EditText && v.getTag(R.id.usesNumericKeyboard) == Boolean 
        .valueOf(true)) { 
       ((EditText) v).setInputType(InputType.TYPE_NULL); 
       ((EditText) v).setCursorVisible(true); 
       v.setOnFocusChangeListener(new OnFocusChangeListener() { 
        @Override 
        public void onFocusChange(View v, boolean hasFocus) { 
         if (hasFocus) 
         { 
          for (NumericKeyboard numericKeyboard : arrNumericKeyboard) { 
           numericKeyboard.currentEditText = (EditText) v; 
           numericKeyboard.setVisibility(View.VISIBLE); 
          } 
         } 
        } 
       }); 
      } 

      if (v instanceof NumericKeyboard) { 
      } else { 
       if (v.getTag(R.id.ignoreMeForNumericKeyboardTouchListener) != Boolean 
         .valueOf(true)) { 
        v.setOnTouchListener(this); 
       } 
       if (v instanceof ViewGroup) { 
        ViewGroup vg = (ViewGroup) v; 
        for (int i = 0; i < vg.getChildCount(); i++) { 
         View vChild = vg.getChildAt(i); 
         queue.add(vChild); 
        } 
       } 
      } 
     } 
    } 

    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     if (v instanceof EditText && v.getTag(R.id.usesNumericKeyboard) == Boolean 
       .valueOf(true)) { 
      for (NumericKeyboard numericKeyboard : arrNumericKeyboard) { 
       numericKeyboard.currentEditText = (EditText) v; 
       numericKeyboard.setVisibility(View.VISIBLE); 
      } 
     } else { 
      for (NumericKeyboard numericKeyboard : arrNumericKeyboard) { 
       numericKeyboard.setVisibility(View.GONE); 
      } 
     } 
     return false; 
    } 

    static ArrayList<NumericKeyboard> arrNumericKeyboard = 
      new ArrayList<NumericKeyboard>(); 

    public static void registerNumericKeyboard(
      NumericKeyboard numericKeyboard) { 

     numericKeyboard.initialize(); 

     arrNumericKeyboard.add(numericKeyboard); 
    } 

    public static void unregisterNumericKeyboard(
      NumericKeyboard numericKeyboard) { 
     arrNumericKeyboard.remove(numericKeyboard); 
    } 

    public static void showForEditText(EditText editText) 
    { 
     for (NumericKeyboard numericKeyboard : arrNumericKeyboard) { 
      numericKeyboard.setVisibility(View.VISIBLE); 
      numericKeyboard.currentEditText = editText; 
     } 
    } 

    public static void hide() 
    { 
     for (NumericKeyboard numericKeyboard : arrNumericKeyboard) { 
      numericKeyboard.setVisibility(View.GONE); 
     } 
    } 
} 

레이아웃 :

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:background="@drawable/background06" 
    android:orientation="vertical" > 

    <LinearLayout 
     android:id="@+id/linearLayout1" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" > 

     <Button 
      android:id="@+id/btn7" 
      android:layout_width="50dip" 
      android:layout_height="50dip" 
      android:text="7" > 
     </Button> 

     <Button 
      android:id="@+id/btn8" 
      android:layout_width="50dip" 
      android:layout_height="50dip" 
      android:text="8" > 
     </Button> 

     <Button 
      android:id="@+id/btn9" 
      android:layout_width="50dip" 
      android:layout_height="50dip" 
      android:text="9" > 
     </Button> 
    </LinearLayout> 

    <LinearLayout 
     android:id="@+id/linearLayout2" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" > 

     <Button 
      android:id="@+id/btn4" 
      android:layout_width="50dip" 
      android:layout_height="50dip" 
      android:text="4" > 
     </Button> 

     <Button 
      android:id="@+id/btn5" 
      android:layout_width="50dip" 
      android:layout_height="50dip" 
      android:text="5" > 
     </Button> 

     <Button 
      android:id="@+id/btn6" 
      android:layout_width="50dip" 
      android:layout_height="50dip" 
      android:text="6" > 
     </Button> 
    </LinearLayout> 

    <LinearLayout 
     android:id="@+id/linearLayout3" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:orientation="horizontal" > 

     <Button 
      android:id="@+id/btn1" 
      android:layout_width="50dip" 
      android:layout_height="50dip" 
      android:text="1" > 
     </Button> 

     <Button 
      android:id="@+id/btn2" 
      android:layout_width="50dip" 
      android:layout_height="50dip" 
      android:text="2" > 
     </Button> 

     <Button 
      android:id="@+id/btn3" 
      android:layout_width="50dip" 
      android:layout_height="50dip" 
      android:text="3" > 
     </Button> 
    </LinearLayout> 

    <LinearLayout 
     android:id="@+id/linearLayout4" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" > 

     <ImageButton 
      android:id="@+id/btnBackSpace" 
      android:layout_width="50dip" 
      android:layout_height="50dip" 
      android:scaleType="fitCenter" 
      android:src="@drawable/backspace" 
      android:text="-" /> 

     <Button 
      android:id="@+id/btn0" 
      android:layout_width="50dip" 
      android:layout_height="50dip" 
      android:text="0" /> 

     <ImageButton 
      android:id="@+id/btnDeleteAll" 
      android:layout_width="50dip" 
      android:layout_height="50dip" 
      android:scaleType="fitCenter" 
      android:src="@drawable/remove02" 
      android:text="-" /> 

    </LinearLayout> 

</LinearLayout> 

를 액티비티 레이아웃에서 사용 :

<org.mabna.order.ui.NumericKeyboard 
         android:id="@+id/numericKeyboard1" 
         android:layout_width="wrap_content" 
         android:layout_height="wrap_content" > 
        </org.mabna.order.ui.NumericKeyboard> 
+0

나는이 Romain Guy 게시에 대한 참조를 추가 할 것이다 http://www.curious-creature.org/2009/02/25/android-layout-trick-2-include-to-reuse/ (질문은 단지 레이아웃에 관한 것이기 때문에, 그러나 그것에 관련된 어떤 논리도 아니다). – sandrstar

+0

@breceivemail thx 이것은 정확히 내가 필요로하는 것입니다. – reizals

+0

믿을만한 답을 얻으려면 단 한 표만 남았습니다. 그것은 stackoverflow에 안드로이드 커뮤니티에 대한 전형적인, 다른 (일부의?) 다른 그룹. –

관련 문제