어제부터 이것을 검색 중입니다. 많은 액티비티에 사용자 이름과 로그인을 표시하는 코드가 있습니다. 나는 모든 액티비티에 레이아웃의 코드를 복사하여 붙여 넣기를 원치 않지만 .NET에서 사용자 컨트롤과 같은 것을 원한다. 사용자 지정 컨트롤에 대한 많은 주제를 읽었거나 이해할 수 없거나이 옵션을 사용하지 못할 수도 있습니다 (해당 옵션에서 belive를 사용하지 마십시오)Android 사용자 정의 컨트롤이 가능합니까?
답변
예 가능합니다. 이 샘플을보십시오. 사용자 지정 숫자 키보드 또는 사용자 지정보기 또는 사용자 지정 사용자 지정 컨트롤입니다. 그것을 사용자 정의하고 자신의 사용자 컨트롤을 만들 : 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>
나는이 Romain Guy 게시에 대한 참조를 추가 할 것이다 http://www.curious-creature.org/2009/02/25/android-layout-trick-2-include-to-reuse/ (질문은 단지 레이아웃에 관한 것이기 때문에, 그러나 그것에 관련된 어떤 논리도 아니다). – sandrstar
@breceivemail thx 이것은 정확히 내가 필요로하는 것입니다. – reizals
믿을만한 답을 얻으려면 단 한 표만 남았습니다. 그것은 stackoverflow에 안드로이드 커뮤니티에 대한 전형적인, 다른 (일부의?) 다른 그룹. –
- 1. 사용자 정의 commitEditingStyle이 가능합니까?
- 2. 사용자 정의 컨트롤이 작동하지 않습니다.
- 3. 사용자 지정 사용자 정의 컨트롤이 충돌합니다.
- 4. 사용자 정의 컨트롤이 아닌 사용자 컨트롤
- 5. 사용자 정의 사용자 정의 컨트롤이 WPF 창에 나타나지 않습니까?
- 6. 사용자 정의 컨트롤이 화면에 제대로 맞지 않습니다.
- 7. 모든 컨트롤이 사용자 정의 컨트롤 내에서 null입니다.
- 8. XAML 사용자 정의 컨트롤이 표시되지 않습니다.
- 9. .Net 사용자 정의 컨트롤이 이벤트를 실행하지 않음
- 10. 사용자 정의 컨트롤이 포함 된 지연로드 탭
- 11. 사용자 정의 컨트롤이 이미 폼에 있는지 테스트합니다
- 12. 마스터 페이지의 사용자 정의 컨트롤이 처음으로로드됩니다.
- 13. wpf 사용자 정의 컨트롤이 인식되지 않습니다.
- 14. 웹 사용자 정의 컨트롤이 Default.aspx에 표시되지 않습니다.
- 15. 데이터 컨트롤의 사용자 정의 컨트롤이 동기화되지 않음
- 16. wpf 사용자 정의 컨트롤이 실행되지 않음
- 17. 사용자 정의 컨트롤이 intellisense에 나타나지 않습니다.
- 18. 중첩 된 사용자 정의 컨트롤이 null입니다.
- 19. 동적으로로드 된 사용자 정의 컨트롤이 렌더링되지 않습니다.
- 20. 사용자 정의 권한 정의 android
- 21. ASP.NET 사용자 지정 템플릿, 여전히 ASP.NET 컨트롤이 가능합니까?
- 22. 세션 개체의 여러 텍스트 상자 컨트롤이 가능합니까?
- 23. 섹션 목록 열의 모양이 사용자 정의 가능합니까?
- 24. 오페라가있는 사용자 정의 base64 이미지 커서 - 가능합니까?
- 25. 리피터, 사용자 정의 페이징, PagedDataSource가 가능합니까?
- 26. Java에서 Thread의 사용자 정의 구현 : JNI가 가능합니까?
- 27. NSTextView에서 채우기 - 사용자 정의 도면없이 가능합니까?
- 28. 사용자 정의 탐색 바가 허용/가능합니까?
- 29. Android 사용자 정의 라이브러리
- 30. Android ActionbarSherlock 사용자 정의
명확하게 당신이 원하는 무슨 말을! ! 왜냐하면 해답은 .NET의 사용자 컨트롤을 모르기 때문일 수 있습니다. –