为什么自定义控件是不是在activity_main.xml中可见 [英] Why Custom Control is not visible in activity_main.xml

查看:97
本文介绍了为什么自定义控件是不是在activity_main.xml中可见的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是新的code,它不会抛出异常,但我看不到我的自定义控制秒。这是新的code:

This is the new code, It doesn't throw exceptions, but I can't see my custom control "Second". This is the new code:

activity_main.xml中:

activity_main.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/layoutRoot"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <LinearLayout
        android:id="@+id/L1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical" >

        <Button
            android:id="@+id/addButton"
            android:layout_width="74dp"
            android:layout_height="wrap_content"
            android:text="Add" />

        <EditText
            android:id="@+id/newEditText"
            android:layout_width="174dp"
            android:layout_height="wrap_content"
            android:layout_weight="3.24"
            android:ems="10"
            android:inputType="text" />
    </LinearLayout>

    <LinearLayout
        android:id="@+id/List"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" >
    </LinearLayout>    
</LinearLayout>

这是自定义控制:second.xml:

This is the custom control: second.xml:

<?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/secodView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" >

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

            <Button
                android:id="@+id/expandButton"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="0.44" 
                android:text = "Expand"/>

            <TextView
                android:id="@+id/txtView"
                android:layout_width="253dp"
                android:layout_height="wrap_content"
                android:layout_weight="0.56"
                android:ems="10" 
                android:text = "LOL"/>  
        </LinearLayout>

        <RadioGroup
            android:id="@+id/ratingRadioGroup"
            android:layout_width="321dp"
            android:layout_height="wrap_content"
            android:orientation="horizontal" >

            <RadioButton
                android:id="@+id/likeButton"
                android:layout_width="145dp"
                android:layout_height="wrap_content"
                android:checked="true"
                android:text="Like" />

            <RadioButton
                android:id="@+id/dislikeButton"
                android:layout_width="147dp"
                android:layout_height="wrap_content"
                android:text="Dislike" />
        </RadioGroup>
</LinearLayout>

Second.java类:

Second.java class:

public class Second extends ViewGroup
{
    private Button mExpandButton;
    private RadioButton mLikeButton;
    private RadioButton mDislikeButton;
    private TextView mText;
    private RadioGroup mLikeGroup;
    private ViewGroup vGroup;

    OnClickListener myClickListener = new OnClickListener()
    {
        @Override
        public void onClick(View v)
        {
            String s= mExpandButton.getText().toString();

            if (s.equals("One Click"))
                mExpandButton.setText("Other Click");
            else
                mExpandButton.setText("One Click");
        }
    };

    OnCheckedChangeListener myCkeckListener = new OnCheckedChangeListener()
    {
        @Override
        public void onCheckedChanged(RadioGroup group, int checkedId)
        {
            if (mLikeButton.isChecked())
                mText.setText("I Like it");

            if (mDislikeButton.isChecked())
                mText.setText("I Don't Like it");
        }
    };

    public Second(Context context) 
    {
        super(context);
        LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View view = LayoutInflater.from(context).inflate(R.layout.second, this, true);

        mText = (TextView)this.findViewById(R.id.txtView);
        mExpandButton = (Button) this.findViewById(R.id.expandButton);
        mLikeGroup = (RadioGroup)this.findViewById(R.id.ratingRadioGroup);
        mExpandButton.setOnClickListener(myClickListener);
        mLikeGroup.setOnCheckedChangeListener(myCkeckListener);

        //inflater.inflate(R.layout.second, null);
    }

    @Override
    protected void onLayout(boolean arg0, int arg1, int arg2, int arg3, int arg4) 
    {
        // TODO Auto-generated method stub      
    }
}

ActivityMain.java类,这里的活动被启动:

ActivityMain.java class, where the activity gets started:

public class MainActivity extends Activity 
{
    protected LinearLayout mList;
    protected EditText mEditText;   
    protected Button mButton;
    Second[] sec;
    boolean unavez; 

    OnClickListener myClickListener = new OnClickListener()
    {
        @Override
        public void onClick(View v)
        {           
        }
    };

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

        mList = (LinearLayout)findViewById(R.id.List);
        mEditText = (EditText)findViewById(R.id.newEditText);
        mButton = (Button)findViewById(R.id.addButton); 

        sec = new Second[4];
        unavez = true;

        for (int i=0; i<4; i++)     
            sec[i]= new Second(this);       
    }

    @Override 
    protected void onStart() 
    {
        super.onStart();
    }

    @Override protected void onResume() 
    {
        super.onResume();

        if (!unavez)
            return;

        for (int i=0; i<4; i++)
        {
            mList.addView(sec[i]);
            //setContentView(sec[i]);
        }

        unavez = false;
    }

    @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;
    }
}

在运行时,我可以看到按钮和activity_main.xml中的EditText上,但我看不到我的second.xml自定义控件。如果我使用该行的setContentView(秒[I]),而不是mList.addView(SEC [I])在onResume(),事情变得更糟糕:在与的EditText activity_main.xml中的按钮是不可见的,并得到了一个空白布局。

When running, I can see the Button and the EditText in activity_main.xml, but I can't see my custom control in second.xml. If I use the line setContentView(sec[i]) instead of mList.addView(sec[i]) in onResume(), it gets worse: the EditText and the Button in activity_main.xml aren't visible and I get a blank layout.

我怎么可以加我的自定义控件activity_main.xml中,并使其对用户可见的?

How can I add my custom control to activity_main.xml and make it visible to user?

推荐答案

您选择让的ViewGroup 。既然你这样做,必须真正的的ViewGroup ,以一个真正的 onLayout()执行情况和其他一切与作为一个的ViewGroup 随之而来。不要只是随机覆盖与无为的实现方法,然后抱怨的时候什么也不做的实现什么也不做。

You elected to have Second inherit directly from ViewGroup. Since you did that, Second needs to be a real ViewGroup, with a real onLayout() implementation and everything else that goes along with being a ViewGroup. Do not just randomly override methods with do-nothing implementations, then complain when the do-nothing implementations do nothing.

创建自定义控件是Android的一个比较高级的主题。初来乍到的Andr​​oid应侧重于其他的解决方案,以任何问题,他们认为自定义控制会以某种方式解决。

Creating "custom controls" is a relatively advanced topic in Android. Newcomers to Android should focus on other solutions to whatever problem they think a "custom control" will somehow solve.

这篇关于为什么自定义控件是不是在activity_main.xml中可见的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆