web-dev-qa-db-ja.com

AndroidカスタムビューのfindViewById()

カスタムビューを作成しました。カスタムビューを操作した後、他のいくつかのビューを更新します。

メインレイアウト:

_<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:custom="http://schemas.Android.com/apk/res-auto"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent">

    <EditText
        Android:id="@+id/display_name"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:inputType="text"
        Android:layout_centerHorizontal="true"
        Android:tag="name"
        Android:ems="10" />

    <EditText
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:inputType="number"
        Android:ems="10"
        Android:id="@+id/id_number"
        Android:layout_centerHorizontal="true"
        Android:layout_below="@id/display_name"/>

    <ge.altasoft.custom_views.IdNumber
        Android:id="@+id/custom_id_number"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_centerHorizontal="true"
        Android:layout_below="@id/id_number"
        Android:paddingLeft="35dip"
        custom:firstName="@id/display_name"/>
</RelativeLayout>
_

カスタムビューレイアウト:

_<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content">

    <EditText
        Android:id="@+id/id_number_custom"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:inputType="number"
        Android:ems="10"
        Android:paddingRight="35dip" />

    <ImageButton
        Android:id="@+id/load_data_button"
        Android:layout_width="30dip"
        Android:layout_height="30dip"
        Android:layout_centerVertical="true"
        Android:src="@drawable/load_data"
        Android:layout_toRightOf="@id/id_number_custom" />

</RelativeLayout>
_

カスタムビュークラス、コンストラクター、リスナー:

_ private int firstNameViewID;

public IdNumber (Context context, AttributeSet attrs) {
        super(context, attrs);
        initViews();

        TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.IdNumber);
        final int N = a.getIndexCount();
        for(int i = 0; i < N; i++){
            int attr = a.getIndex(i);
            switch(attr){
                case R.styleable.IdNumber_firstName:
                    firstNameViewID = a.getResourceId(attr, -1);
                    break;
            }
        }
        a.recycle();
    }



 private void initViews() {
        inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        inflater.inflate(R.layout.id_number_edit_text_custom, this, true);
        editText = (EditText) findViewById(R.id.id_number_custom);
        loadButton = (ImageButton) findViewById(R.id.load_data_button);
        loadButton.setVisibility(RelativeLayout.INVISIBLE);
        loadData();
    }

private void loadData(){
        loadButton.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                EditText firstName = (EditText) findViewById(R.id.display_name);
                firstName.setText("Some Text");
            }
        });
    }
_

問題は、EditText firstName = (EditText) findViewById(R.id.display_name);がnullを返すことです。 findViewById()を呼び出すだけで、それを拡張したレイアウトでビューが検索されることを知っています。

可能であれば、メインレイアウトからid:display_nameのEditTextのビューを取得するにはどうすればよいですか?

前もって感謝します。

17
Jilberta
View Custmv;

 private void initViews() {
        inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        Custmv = inflater.inflate(R.layout.id_number_edit_text_custom, this, true);
        editText = (EditText) findViewById(R.id.id_number_custom);
        loadButton = (ImageButton) findViewById(R.id.load_data_button);
        loadButton.setVisibility(RelativeLayout.INVISIBLE);
        loadData();
    }

private void loadData(){
        loadButton.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                EditText firstName = (EditText) Custmv.getParent().findViewById(R.id.display_name);
                firstName.setText("Some Text");
            }
        });
    }

このようにしてみてください。

11
Siddhesh

以下のようにメソッドを変更し、動作することを確認します

private void initViews() {
    inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    inflater.inflate(R.layout.id_number_edit_text_custom, this, true);
    View view = (View) inflater.inflate(R.layout.main, null);
    editText = (EditText) view.findViewById(R.id.id_number_custom);
    loadButton = (ImageButton) view.findViewById(R.id.load_data_button);
    loadButton.setVisibility(RelativeLayout.INVISIBLE);
    loadData();
} 
2
Usman Kurd

固定レイアウトの場合、次のようにできます。

public void onClick(View v) {
   ViewGroup parent = (ViewGroup) IdNumber.this.getParent();
   EditText firstName = (EditText) parent.findViewById(R.id.display_name);
   firstName.setText("Some Text");
}

柔軟なレイアウトでEditTextを見つけたい場合は、後でお手伝いします。この助けを願っています。

0
hieuxit
@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View row = convertView;
    ImageHolder holder = null;
    if (row == null) {
        LayoutInflater inflater = ((Activity) context).getLayoutInflater();
        row = inflater.inflate(layoutResourceId, parent, false);
        holder = new ImageHolder();
        editText = (EditText) row.findViewById(R.id.id_number_custom);
        loadButton = (ImageButton) row.findViewById(R.id.load_data_button);
        row.setTag(holder);
    } else {
        holder = (ImageHolder) row.getTag();
    }


    holder.editText.setText("Your Value");
    holder.loadButton.setImageBitmap("Your Bitmap Value");
    return row;
}
0
Dhaval Patel

次のようなものを試すことができます:

カスタムビューコンストラクター内:

mContext = context;

次にカスタムビュー内で呼び出すことができます:

((MainActivity) mContext).updateText( text );

MainAcivity内で定義:

public void updateText(final String text) {

     TextView txtView = (TextView) findViewById(R.id.text);
     txtView.setText(text);
}

わたしにはできる。

0
Slavomir Fabian

あなたのコンストラクタでこれを試してください

MainActivity maniActivity = (MainActivity)context;
EditText firstName = (EditText) maniActivity.findViewById(R.id.display_name);
0
VijayRaj