Установите собственный макет в всплывающем окне в android

У меня проблема со всплывающим окном. Я хочу создать всплывающее окно с моим собственным макетом. Это код:

public class PopupWindowView extends PopupWindow{ PopupWindow popup; boolean click = true; LayoutParams params; RelativeLayout mainLayout; TextView tv; LinearLayout layout; ImageView chooseFlag; public void createPopupWindow(Activity act){ popup = new PopupWindow(act); chooseFlag = (ImageView) act.findViewById(R.id.login_choose_flag); mainLayout = (RelativeLayout) act.findViewById(R.id.login_layout); tv = new TextView(act); layout = new LinearLayout(act); //layout = (LinearLayout) findViewById(R.id.popuplayout); chooseFlag.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (click) { int[] values = new int[2]; v.getLocationOnScreen(values); popup.showAtLocation(mainLayout, Gravity.NO_GRAVITY, 10, 10); popup.update(values[0], values[1], 300, 80); click = false; } else { popup.dismiss(); click = true; } } }); params = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); layout.setOrientation(LinearLayout.VERTICAL); tv.setText("Hi this is a sample text for popup window"); layout.addView(tv, params); popup.setContentView(layout); } } 

И это макет, который я хочу установить в своем всплывающем окне:

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

В моем классе я не могу использовать метод findbyid потому что это не Activity. Как я могу установить свой собственный макет во всплывающей вдове в моем классе?

Изменить: это трассировка стека, где я получаю ошибку:

 03-01 09:48:48.761: E/AndroidRuntime(16776): FATAL EXCEPTION: main 03-01 09:48:48.761: E/AndroidRuntime(16776): java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first. 03-01 09:48:48.761: E/AndroidRuntime(16776): at android.view.ViewGroup.addViewInner(ViewGroup.java:3337) 03-01 09:48:48.761: E/AndroidRuntime(16776): at android.view.ViewGroup.addView(ViewGroup.java:3208) 03-01 09:48:48.761: E/AndroidRuntime(16776): at android.view.ViewGroup.addView(ViewGroup.java:3188) 03-01 09:48:48.761: E/AndroidRuntime(16776): at android.widget.PopupWindow.preparePopup(PopupWindow.java:969) 03-01 09:48:48.761: E/AndroidRuntime(16776): at android.widget.PopupWindow.showAtLocation(PopupWindow.java:840) 03-01 09:48:48.761: E/AndroidRuntime(16776): at android.widget.PopupWindow.showAtLocation(PopupWindow.java:813) 03-01 09:48:48.761: E/AndroidRuntime(16776): at pl.asseco.amms.mobile.tools.PopupWindowView$1.onClick(PopupWindowView.java:44) 03-01 09:48:48.761: E/AndroidRuntime(16776): at android.view.View.performClick(View.java:3558) 03-01 09:48:48.761: E/AndroidRuntime(16776): at android.view.View$PerformClick.run(View.java:14152) 03-01 09:48:48.761: E/AndroidRuntime(16776): at android.os.Handler.handleCallback(Handler.java:605) 03-01 09:48:48.761: E/AndroidRuntime(16776): at android.os.Handler.dispatchMessage(Handler.java:92) 03-01 09:48:48.761: E/AndroidRuntime(16776): at android.os.Looper.loop(Looper.java:137) 03-01 09:48:48.761: E/AndroidRuntime(16776): at android.app.ActivityThread.main(ActivityThread.java:4514) 03-01 09:48:48.761: E/AndroidRuntime(16776): at java.lang.reflect.Method.invokeNative(Native Method) 03-01 09:48:48.761: E/AndroidRuntime(16776): at java.lang.reflect.Method.invoke(Method.java:511) 03-01 09:48:48.761: E/AndroidRuntime(16776): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:790) 03-01 09:48:48.761: E/AndroidRuntime(16776): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557) 03-01 09:48:48.761: E/AndroidRuntime(16776): at dalvik.system.NativeStart.main(Native Method) 

Изменить действие, в котором используется всплывающее окно:

 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_login); getActionBar().hide(); mainMenuGenerator = new MainMenuGenerator(); mainMenuGenerator.generateMainMenu(this); mainMenuGenerator.hideIcons(); popup = new PopupWindowView(); popup.createPopupWindow(this); } 

Solutions Collecting From Web of "Установите собственный макет в всплывающем окне в android"

Попробуйте этот код:

 private void showSortPopup(final Activity context, Point p) { // Inflate the popup_layout.xml LinearLayout viewGroup = (LinearLayout) context.findViewById(R.id.llSortChangePopup); LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); View layout = layoutInflater.inflate(R.layout.sort_popup_layout, viewGroup); // Creating the PopupWindow changeSortPopUp = new PopupWindow(context); changeSortPopUp.setContentView(layout); changeSortPopUp.setWidth(LinearLayout.LayoutParams.WRAP_CONTENT); changeSortPopUp.setHeight(LinearLayout.LayoutParams.WRAP_CONTENT); changeSortPopUp.setFocusable(true); // Some offset to align the popup a bit to the left, and a bit down, relative to button's position. int OFFSET_X = -20; int OFFSET_Y = 95; // Clear the default translucent background changeSortPopUp.setBackgroundDrawable(new BitmapDrawable()); // Displaying the popup at the specified location, + offsets. changeSortPopUp.showAtLocation(layout, Gravity.NO_GRAVITY, px + OFFSET_X, py + OFFSET_Y); // Getting a reference to Close button, and close the popup when clicked. Button close = (Button) layout.findViewById(R.id.close); close.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { changeSortPopUp.dismiss(); } }); } 

Вы можете использовать следующий код. Для этого вам нужно использовать PopupWindow.

 PopupWindow mpopup; 

То вам нужно раздуть ваше мнение.

  View popUpView = getLayoutInflater().inflate(R.layout.activity_login, null); // inflating popup layout mpopup = new PopupWindow(popUpView, LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT, true); // Creation of popup mpopup.setAnimationStyle(android.R.style.Animation_Dialog); mpopup.showAtLocation(popUpView, Gravity.CENTER, 0, 0); // Displaying popup 

Если в вашем макете есть какой-то элемент, вам необходимо связать этот элемент с вашим представлением.

  TextView some = (TextView) popUpView.findViewById(R.id.some); Button btnCancel = (Button) popUpView.findViewById(R.id.btnCancel); 

OnClickListener вашего всплывающего окна.

  btnCancel.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { mpopup.dismiss(); } }); 

Вы можете отклонить свой PopupWindow, используя mpopup.dismiss();

Вы можете использовать LayoutInflater

 LayoutInflater inflater = (LayoutInflater) act.getSystemService(Context.LAYOUT_INFLATER_SERVICE); View view = inflater.inflate(R.layout.custom_layout, null); //custom_layout is your xml file which contains popuplayout LinearLayout layout = (LinearLayout) view.findViewById(R.id.popuplayout); 

Привет, этот пост состоит из решения вашего вопроса

Попробуйте этот код:

 public class ShowPopUp extends Activity { PopupWindow popUp; LinearLayout layout; TextView tv; LayoutParams params; LinearLayout mainLayout; Button but; boolean click = true; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); popUp = new PopupWindow(this); layout = new LinearLayout(this); mainLayout = new LinearLayout(this); tv = new TextView(this); but = new Button(this); but.setText("Click Me"); but.setOnClickListener(new OnClickListener() { public void onClick(View v) { if (click) { popUp.showAtLocation(mainLayout, Gravity.BOTTOM, 10, 10); popUp.update(50, 50, 300, 80); click = false; } else { popUp.dismiss(); click = true; } } }); params = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); layout.setOrientation(LinearLayout.VERTICAL); tv.setText("Hi this is a sample text for popup window"); layout.addView(tv, params); popUp.setContentView(layout); // popUp.showAtLocation(layout, Gravity.BOTTOM, 10, 10); mainLayout.addView(but, params); setContentView(mainLayout); } } 

попробуй это……

 public void popUpWindow() { final Dialog dialog = new Dialog(MainActivity.this); dialog.setContentView(R.layout.client_details); dialog.setTitle("Client Details"); dialog.show(); } 
  alert=(Button)findViewById(R.id.click); detail=(ImageView)findViewById(R.id.goDetail); alert.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { // custom dialog final Dialog dialog = new Dialog(context); dialog.setContentView(R.layout.custom); dialog.setTitle(Html.fromHtml("<font color='#EC407A'>About</font>")); Button dialogButton = (Button) dialog.findViewById(R.id.dialogOK); ImageView img = (ImageView) dialog.findViewById(R.id.goDetail); // if button is clicked, close the custom dialog dialogButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { dialog.dismiss(); Toast.makeText(getApplicationContext(),"Dismissed..!!",Toast.LENGTH_SHORT).show(); } }); img.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { i=new Intent(getApplication(),CustomDetail.class); setIntent(i); Toast.makeText(Dashboard.this, "Check detail ", Toast.LENGTH_SHORT).show(); } }); dialog.show(); }