如何更改弹出窗口文本视图中的文本?


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_check_attendance);
Intent intent = getIntent();

final ArrayList<String> names = intent.getStringArrayListExtra("names");
final ListView name_list = findViewById(R.id.name_list);
final ArrayAdapter<String> adapter = new ArrayAdapter<>(this,
android.R.layout.simple_list_item_1, names);
name_list.setAdapter(adapter);

name_list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
Log.i("Name",names.get(i));
LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
View popupview = inflater.inflate(R.layout.popup_window, null);

int width = LinearLayout.LayoutParams.WRAP_CONTENT;
int height = LinearLayout.LayoutParams.WRAP_CONTENT;
popupWindow  = new PopupWindow(popupview, width, height, true);
popupWindow.showAtLocation(view, Gravity.CENTER, 0,0);

}
});
}

在上面的代码中,一切都运行良好,除了我想将弹出窗口文本设置为列表视图中单击的元素。

我使用Log.i(),并且正在打印单击的元素,但是当我尝试将文本设置为此单击的元素时,例如:

TextView sub_name = findViewById(R.id.subject_name);
sub_name.setText(names.get(i));

我收到以下错误:

java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法 'void android.widget.TextView.setText(java.lang.CharSequence('

弹出窗口的 XML:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/close"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="161dp"
android:layout_marginTop="587dp"
android:layout_marginEnd="162dp"
android:layout_marginBottom="96dp"
android:onClick="quit"
android:text="Close"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/subject_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="176dp"
android:layout_marginTop="258dp"
android:layout_marginEnd="176dp"
android:layout_marginBottom="455dp"
android:text="TextView"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

在给视图充气后放

LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
View popupview = inflater.inflate(R.layout.popup_window, null);
int width = LinearLayout.LayoutParams.WRAP_CONTENT;
int height = LinearLayout.LayoutParams.WRAP_CONTENT;
popupWindow  = new PopupWindow(popupview, width, height, true);
popupWindow.showAtLocation(view, Gravity.CENTER, 0,0);
TextView sub_name = popupview.findViewById(R.id.subject_name);
sub_name.setText(names.get(i));

从 API 级别 1 及更高版本,您可以将内容放入 PopupWindow 中,这是一个新的临时窗口,您可以在其中放置将显示在当前活动窗口顶部的视图。PopupWindow 可以显示在屏幕上的任何位置,方法是提供显式位置或提供 PopupWindow 应锚定到的现有视图。

PopupWindow 用于在指定位置显示浮动视图,但不插入或以其他方式修改现有视图层次结构。它是一个浮动容器,显示在当前活动的顶部。PopupWindow可以有自己的布局,并且可以在使用setContentView(View(膨胀后进行设置。

从 API 级别 18 及更高版本开始,您可以使用较新的 ViewOverlay 在视图之上绘制内容。ViewOverlay 允许您将任意数量的可绘制对象添加到由父视图管理的私有图层。只要这些对象的边界在父对象的边界内,它们就会绘制在相应视图的顶部。

为了在视图层次结构之上绘制内容,我们首先需要创建要显示的内容。以下列表(file res/layout/popup.xml(构造了一组简单的视图,这些视图将成为我们的弹出窗口的内容

Public class MainActivity extends Activity
private PopupWindow popup;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//inflate the popup content layout; we do not have access
//to the parent view yet, so we pass null as the
//container view parameter.
View popupContent = getLayoutInflater().inflate(R.layout.popup, null);
popup = new PopupWindow();
//popup should wrap content view
popup.setWindowLayoutMode(
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.WRAP_CONTENT);
popup.setHeight(250);
popup.setWidth(350);
//set content and background
popup.setContentView(popupContent);
popup.setBackgroundDrawable(getResources().getDrawable(R.drawable.popup_background));
popupContent.findViewById(R.id.btnClose).setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
popup.dismiss();
}
});
popup.setTouchInterceptor(this);
popup.setFocusable(true);
popup.setOutsideTouchable(true);
}
@Override
protected void onPause() {
super.onPause();
popup.dismiss();
}
@Override
public boolean onTouch(View v, MotionEvent event) {
//Handle direct touch events passed to the PopupWindow
return false;
}
public void onShowWindowClick(View v) {
if (popup.isShowing()) {
popup.dismiss();
} else {
//Show the PopupWindow anchored to the button we
//pressed. It will be displayed below the button
//if there's room, otherwise above.
popup.showAsDropDown(v);
}
}
}

最新更新