2015-09-28 3 views
3

Я новичок в создании приложения для Android. Я хочу добавить новый «пользовательский вид», который состоит из кнопок и imageView, когда я нажимаю кнопку в MainActivity. Я сделал следующий список сайтов, чтобы создать пользовательский вид.Android: Как динамически добавлять «Пользовательский вид» в линейный макет

javatechig developer.android.com

Они работают идеально. Однако, если я хочу, чтобы динамически добавлять настраиваемое представление с

sView sview = new sView(MainActivity.this); 

ничего случиться позже ...

Или, если я хочу, чтобы новый пользовательский взгляд на

sView sview = new sView(MainActivity.this, attrs); 

Где можно найти и установить attrs ????

Вот мой код, в MainActivity,

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    myDraw = (RelativeLayout) findViewById(R.id.myDraw); 
    btnAddRect = (Button) findViewById(R.id.btnAdd); 

    mfView = (sView) findViewById(R.id.draw); 
    btnAdd.setOnClickListener(new OnClickListener() {  

     @Override 
     public void onClick(View v) { 
      SingleFingerView sFingerView = new sView(MainActivity.this); 
      myDraw.addView(sFingerView); 
     } 
    }); 
} 

в настраиваемое представление,

public class sView extends LinearLayout{ 

public sView(Context context) { 
    this(context, null, 0); 
} 

public sView(Context context, AttributeSet attrs) { 
    this(context, attrs, 0); 
} 

public sView(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
    this._1dp = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 1, context.getResources().getDisplayMetrics()); 
    this.parseAttr(context, attrs); 
    View mRoot = View.inflate(context, R.layout.test_image_view, null); 
    addView(mRoot, -1, -1); 
    mView = (ImageView) mRoot.findViewById(R.id.view); 
    mPushView = (ImageView) mRoot.findViewById(R.id.pview); 
    mFirmView = (ImageView) mRoot.findViewById(R.id.fview); 
    mRemoveView = (ImageView) mRoot.findViewById(R.id.rview); 
} 

private void parseAttr(Context context, AttributeSet attrs) {  
if (attrs == null) return; 
     TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.sView); 
    if (a != null) { 
     int n = a.getIndexCount(); 
     for (int i = 0; i < n; i++) { 
      int attr = a.getIndex(i); 

      if (attr == R.styleable.sView_centerInParent) { 
       this.mCenterInParent = a.getBoolean(attr, true); 
      } ... 
       with some attributes set setting 
     } 
    } 
} 

@Override 
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
    super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
    setParamsForView(widthMeasureSpec, heightMeasureSpec); // some params are set here 
} 

и файл XML main.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    xmlns:pushtouch="http://schemas.android.com/apk/res-auto" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:orientation="vertical" 
android:paddingBottom="@dimen/activity_vertical_margin" 
android:paddingLeft="@dimen/activity_horizontal_margin" 
android:paddingRight="@dimen/activity_horizontal_margin" 
android:paddingTop="@dimen/activity_vertical_margin" 
tools:context=".MainActivity" > 
<TextView 
    android:id="@+id/tv_touch" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="abc" 
    android:singleLine="false" 
    /> 
    <Button 
     android:id="@+id/btnAdd" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:text="ADD IMAGE" /> 
<RelativeLayout 
    android:id="@+id/myDraw" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 

<com.example.sView 
     android:id="@+id/draw" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     pushtouch:centerInParent="true" 

     pushtouch:image="@drawable/image" 
     pushtouch:image_width="120dp" 
     pushtouch:image_height="100dp" 

     pushtouch:push_image="@drawable/p_btn" 
     pushtouch:push_image_width="50dp" 
     pushtouch:push_image_height="50dp" 

     pushtouch:firm_image="@drawable/ok" 
     pushtouch:firm_image_width="50dp" 
     pushtouch:firm_image_height="50dp" 

     pushtouch:remove_image="@drawable/remove" 
     pushtouch:remove_image_width="50dp" 
     pushtouch:remove_image_height="50dp" 

     android:scaleType="centerInside" 
     android:layout_alignLeft="@id/result" 
     android:layout_alignTop="@id/result" 
     android:layout_alignRight="@id/result" 
     android:layout_alignBottom="@id/result" 
     /> 
</RelativeLayout> 
</LinearLayout> 

и соответствующие view t_view.xml

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     android:id="@+id/drawLayout" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent"> 
<ImageView 
     android:id="@+id/view" 
     android:layout_width="200dp" 
     android:layout_height="200dp" 
     android:focusableInTouchMode="true" 
     android:focusable="true"/> 
<ImageView 
     android:id="@+id/push_view" 
     android:layout_width="50dp" 
     android:layout_height="50dp" 
     android:clickable="true" 
     android:focusable="true" 
     android:focusableInTouchMode="true" 
     /> 
<ImageView 
     android:id="@+id/firm_view" 
     android:layout_width="50dp" 
     android:layout_height="50dp" 
     android:clickable="true" 
     android:focusable="true" 
     android:focusableInTouchMode="true" 
     /> 
<ImageView 
     android:id="@+id/remove_view" 
     android:layout_width="50dp" 
     android:layout_height="50dp" 
     android:clickable="true" 
     android:focusable="true" 
     android:focusableInTouchMode="true" 
     /> 
</FrameLayout> 

ответ

1

Используйте LayoutInflator, чтобы создать представление на основе шаблона макета, а затем вводит его в поле зрения, когда вам это нужно.

LayoutInflater vi = (LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
View v = vi.inflate(R.layout.your_layout, null); 

// fill in any details dynamically here 
TextView textView = (TextView) v.findViewById(R.id.a_text_view); 
textView.setText("your text"); 

// insert into main view 
ViewGroup insertPoint = (ViewGroup) findViewById(R.id.insert_point); 
insertPoint.addView(v, 0, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT)); 

Возможно, вам придется отрегулировать индекс, в который вы хотите вставить представление.

Android - Dynamically Add Views into View

+0

БОЛЬШОЙ ответ на вопрос! Большое спасибо!! – Anthony

0

u может добавить функцию геттера и сеттера. ATTRS используемая в xml.or и можно сделать так:

test.xml 
<com.example.sView 
    android:id="@+id/draw" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    pushtouch:centerInParent="true" 

    pushtouch:image="@drawable/image" 
    pushtouch:image_width="120dp" 
    pushtouch:image_height="100dp" 

    pushtouch:push_image="@drawable/p_btn" 
    pushtouch:push_image_width="50dp" 
    pushtouch:push_image_height="50dp" 

    pushtouch:firm_image="@drawable/ok" 
    pushtouch:firm_image_width="50dp" 
    pushtouch:firm_image_height="50dp" 

    pushtouch:remove_image="@drawable/remove" 
    pushtouch:remove_image_width="50dp" 
    pushtouch:remove_image_height="50dp" 

    android:scaleType="centerInside" 
    android:layout_alignLeft="@id/result" 
    android:layout_alignTop="@id/result" 
    android:layout_alignRight="@id/result" 
    android:layout_alignBottom="@id/result" 
    /> 
    onclick -> { 
     View v = getLayoutInflater().inflate(R.layout.a,null); 
     myDraw.addView(sFingerView); 
    } 
+0

Можете ли вы подробно описать свой метод? – Anthony