gpt4 book ai didi

其他 xml 文件中的 Android 触发按钮

转载 作者:搜寻专家 更新时间:2023-11-01 08:05:44 24 4
gpt4 key购买 nike

我正在尝试从另一个 xml 文件访问一个按钮,该文件用于自定义列表中的每一行。但是我该怎么做,因为我在设置 onClick 监听器时遇到空指针异常。我的代码如下所示。

主.xml

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

行.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/list_item">

<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:id="@+id/list_item_text_view"
android:textSize="20sp"
android:padding="10dp"
android:layout_weight="1"
android:layout_marginLeft="35dp" />

<Button
android:id="@+id/b1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>

这是我的 Activity 课

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

Button b1 = (Button)findViewById(R.id.b1);
b1.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub

}
});

所以基本上如何在 main.xml 上设置 Activity View 时将 onclicklistener 设置为 row.xml 的 b1

最佳答案

使用 LayoutInflater:

public class Main extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

LayoutInflater inflater = this.getLayoutInflater();
LinearLayout v = (LinearLayout)inflater.inflate(R.layout.hello, null);
Button bt1 = (Button)v.findViewById(R.id.btLog);
bt1.setOnClickListener(new OnClickListener() {

public void onClick(View v) {
// TODO Auto-generated method stub

}
});
}
}

更新 *可扩展布局*

public class ExpandablePanel extends LinearLayout {

private final int mHandleId;
private final int mContentId;

private View mHandle;
private View mContent;

private boolean mExpanded = false;
private int mCollapsedHeight = 0;
private int mContentHeight = 0;
private int mAnimationDuration = 0;

private OnExpandListener mListener;

public ExpandablePanel(Context context) {
this(context, null);
}

public ExpandablePanel(Context context, AttributeSet attrs) {
super(context, attrs);
mListener = new DefaultOnExpandListener();



TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.ExpandablePanel, 0, 0);


// How high the content should be in "collapsed" state
mCollapsedHeight = (int) a.getDimension(R.styleable.ExpandablePanel_collapsedHeight, 0.0f);

// How long the animation should take
mAnimationDuration = a.getInteger(R.styleable.ExpandablePanel_animationDuration, 500);

int handleId = a.getResourceId(R.styleable.ExpandablePanel_handle, 0);
if (handleId == 0) {
throw new IllegalArgumentException(
"The handle attribute is required and must refer "
+ "to a valid child.");
}

int contentId = a.getResourceId(R.styleable.ExpandablePanel_content, 0);
if (contentId == 0) {
throw new IllegalArgumentException("The content attribute is required and must refer to a valid child.");
}

mHandleId = handleId;
mContentId = contentId;

a.recycle();
}

public void setOnExpandListener(OnExpandListener listener) {
mListener = listener;
}

public void setCollapsedHeight( int collapsedHeight ) { mCollapsedHeight = collapsedHeight; android.view.ViewGroup.LayoutParams lp = mContent.getLayoutParams(); lp.height = mCollapsedHeight; mContent.setLayoutParams( lp ); }

public void setAnimationDuration(int animationDuration) {
mAnimationDuration = animationDuration;
}

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

mHandle = findViewById(mHandleId);
if (mHandle == null) {
throw new IllegalArgumentException(
"The handle attribute is must refer to an"
+ " existing child.");
}

mContent = findViewById(mContentId);
if (mContent == null) {
throw new IllegalArgumentException(
"The content attribute must refer to an"
+ " existing child.");
}

android.view.ViewGroup.LayoutParams lp = mContent.getLayoutParams();
lp.height = mCollapsedHeight;
mContent.setLayoutParams(lp);

mHandle.setOnClickListener(new PanelToggler());
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
// First, measure how high content wants to be
mContent.measure(widthMeasureSpec, MeasureSpec.UNSPECIFIED);
mContentHeight = mContent.getMeasuredHeight();

if (mContentHeight < mCollapsedHeight) {
mHandle.setVisibility(View.GONE);
} else {
mHandle.setVisibility(View.VISIBLE);
}

// Then let the usual thing happen
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}

private class PanelToggler implements OnClickListener {
public void onClick(View v) {
Animation a;
if (mExpanded) {
a = new ExpandAnimation(mContentHeight, mCollapsedHeight);
mListener.onCollapse(mHandle, mContent);
} else {
a = new ExpandAnimation(mCollapsedHeight, mContentHeight);
mListener.onExpand(mHandle, mContent);
}
a.setDuration(mAnimationDuration);
if(mContent.getLayoutParams().height == 0) //Need to do this or else the animation will not play if the height is 0
{
android.view.ViewGroup.LayoutParams lp = mContent.getLayoutParams();
lp.height = 1;
mContent.setLayoutParams(lp);
mContent.requestLayout();
}
mContent.startAnimation(a);
mExpanded = !mExpanded;
}
}

private class ExpandAnimation extends Animation {
private final int mStartHeight;
private final int mDeltaHeight;

public ExpandAnimation(int startHeight, int endHeight) {
mStartHeight = startHeight;
mDeltaHeight = endHeight - startHeight;
}

@Override
protected void applyTransformation(float interpolatedTime, Transformation t) {
android.view.ViewGroup.LayoutParams lp = mContent.getLayoutParams();
lp.height = (int) (mStartHeight + mDeltaHeight * interpolatedTime);
mContent.setLayoutParams(lp);
}

@Override
public boolean willChangeBounds() {
return true;
}
}

public interface OnExpandListener {
public void onExpand(View handle, View content);
public void onCollapse(View handle, View content);
}

private class DefaultOnExpandListener implements OnExpandListener {
public void onCollapse(View handle, View content) {}
public void onExpand(View handle, View content) {}
}
}

布局:把这个放在上面: xmlns:cl="http://schemas.android.com/res/com.example.androidapp.widgets"Eclipse 将始终指示此布局中的错误,因为 ExpandablePanel.class 中的 Throw Exceptions,因此您可以隐藏这些行以查看可扩展布局的显示方式并设置其按钮和文本子项。

<com.example.androidapp.widgets.ExpandablePanel
android:id="@+id/theId"
android:layout_width="fill_parent"
android:layout_height="match_parent"
android:orientation="vertical"
app:collapsedHeight="80dp"
app:content="@+id/value"
app:handle="@+id/expand"
cl:collapsedHeight="50dip"
cl:content="@+id/value"
cl:handle="@+id/expand" >

<TextView
android:id="@id/value"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="hejahdkashfa afsjkhas lf ksajfh as fkjsah asf kfsahkjfas klfajsh flkas klfajsh lasfkl aklfsjh klsa ffhaskljfha dfasfa s safjsfkhasjkf fjakshfjkasf jksfhjkasf sjakfhas kjfa sjkfhakjsfh asjsfhkjashf askjsf sakjfh as fadsfasf af asf asf" />

<Button
android:id="@id/expand"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical|center_horizontal"
android:text="More" />

</com.example.androidapp.widgets.ExpandablePanel>

如何设置可扩展面板:

// Set expandable panel listener
ExpandablePanel panel = (ExpandablePanel)findViewById(R.id.theId);
panel.setCollapsedHeight(50);
panel.setContentDescription(descricao);
panel.setOnExpandListener(new ExpandablePanel.OnExpandListener() {
public void onCollapse(View handle, View content) {
Button btn = (Button)handle;
btn.setText("More");
}
public void onExpand(View handle, View content) {
Button btn = (Button)handle;
btn.setText("Less");
}
});

关于其他 xml 文件中的 Android 触发按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14523370/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com