2

menuoptions から popupdialogue を表示しようとしています。コードは -

public void createNewList(){
        popupCreateList = new PopupWindow(popupCreateListView,LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);
        popupCreateList.setBackgroundDrawable(new BitmapDrawable());
        popupCreateList.setOutsideTouchable(true);
        Log.i(TAG,"popUpListView-->>>" + popUpListView.getParent());
        //((ViewGroup)popUpListView.getParent()).removeView(popUpListView); <--Commented

        popupCreateList.showAtLocation(findViewById(R.id.layoutTaskManagerID), Gravity.CENTER, 0, 0); <-- ERROR
        //popupCreateList.showAsDropDown(listsButton, 50, -30);

    }

実行しようとするたびに、次のlogcatエラーが発生しました-

12-30 14:43:00.735: E/AndroidRuntime(1385): FATAL EXCEPTION: main
12-30 14:43:00.735: E/AndroidRuntime(1385): java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
12-30 14:43:00.735: E/AndroidRuntime(1385):     at android.view.ViewGroup.addViewInner(ViewGroup.java:3378)
12-30 14:43:00.735: E/AndroidRuntime(1385):     at android.view.ViewGroup.addView(ViewGroup.java:3249)
12-30 14:43:00.735: E/AndroidRuntime(1385):     at android.view.ViewGroup.addView(ViewGroup.java:3225)
12-30 14:43:00.735: E/AndroidRuntime(1385):     at android.widget.PopupWindow.preparePopup(PopupWindow.java:965)
12-30 14:43:00.735: E/AndroidRuntime(1385):     at android.widget.PopupWindow.showAtLocation(PopupWindow.java:836)
12-30 14:43:00.735: E/AndroidRuntime(1385):     at android.widget.PopupWindow.showAtLocation(PopupWindow.java:809)
12-30 14:43:00.735: E/AndroidRuntime(1385):     at ray.kaushik.simple.task.manager.TaskManagerActivity.createNewList(TaskManagerActivity.java:340)
12-30 14:43:00.735: E/AndroidRuntime(1385):     at ray.kaushik.simple.task.manager.TaskManagerActivity.onMenuItemSelected(TaskManagerActivity.java:324)
12-30 14:43:00.735: E/AndroidRuntime(1385):     at com.android.internal.policy.impl.PhoneWindow.onMenuItemSelected(PhoneWindow.java:958)
12-30 14:43:00.735: E/AndroidRuntime(1385):     at com.android.internal.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:735)
12-30 14:43:00.735: E/AndroidRuntime(1385):     at com.android.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:149)
12-30 14:43:00.735: E/AndroidRuntime(1385):     at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:874)
12-30 14:43:00.735: E/AndroidRuntime(1385):     at com.android.internal.view.menu.IconMenuView.invokeItem(IconMenuView.java:468)
12-30 14:43:00.735: E/AndroidRuntime(1385):     at com.android.internal.view.menu.IconMenuItemView.performClick(IconMenuItemView.java:126)
12-30 14:43:00.735: E/AndroidRuntime(1385):     at android.view.View$PerformClick.run(View.java:16966)
12-30 14:43:00.735: E/AndroidRuntime(1385):     at android.os.Handler.handleCallback(Handler.java:615)
12-30 14:43:00.735: E/AndroidRuntime(1385):     at android.os.Handler.dispatchMessage(Handler.java:92)
12-30 14:43:00.735: E/AndroidRuntime(1385):     at android.os.Looper.loop(Looper.java:137)
12-30 14:43:00.735: E/AndroidRuntime(1385):     at android.app.ActivityThread.main(ActivityThread.java:4745)
12-30 14:43:00.735: E/AndroidRuntime(1385):     at java.lang.reflect.Method.invokeNative(Native Method)
12-30 14:43:00.735: E/AndroidRuntime(1385):     at java.lang.reflect.Method.invoke(Method.java:511)
12-30 14:43:00.735: E/AndroidRuntime(1385):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
12-30 14:43:00.735: E/AndroidRuntime(1385):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
12-30 14:43:00.735: E/AndroidRuntime(1385):     at dalvik.system.NativeStart.main(Native Method)

2 回目にクリックしようとすると、このエラーが発生します。ビューを削除するためにコメント行のコメントを外しても、同じままです。dumone plz がこの理由を教えてくれますか? Android 開発は初めてなので、詳しく教えてください。同じことについて何かアイデアはありますか?事前に感謝します。

レイ

4

2 に答える 2

0

Alert を使用するのではなく、このようにしている特定の理由はありますか? アラートはポップアップ ダイアログです (複数のボタンを配置できます)。もう 1 つのアプローチ (Alert では不十分な場合) は、Alert テーマ (マニフェストで設定) を持つアクティビティ全体を作成することです。これを呼び出すstartActivity()と、完全に機能するアクティビティであってもアラートのように見えます。これはアクティビティ スタックの一番上に存在します)。

私があなたを理解していない限り、あなたがメニューから始めようとしているという事実はまったく重要ではありません. どこからでも始められます。

于 2012-12-30T09:49:01.153 に答える
0

この実用的なサンプル コード (私が作成してテストしました) を使用して、ニーズに合わせてください: create menu\my_options_menu.xml

 <menu xmlns:android="http://schemas.android.com/apk/res/android">
 <item android:id="@+id/popup1" 
 android:title="popup1" />
 </menu>

layout\popup.xml を作成

 <?xml version="1.0" encoding="utf-8"?>
  <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="fill_parent"
   android:layout_height="fill_parent"
   android:orientation="vertical" 
   android:background="@android:color/background_light">
   <LinearLayout 
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical" 
    android:layout_margin="1dp"
    android:background="@android:color/darker_gray">
    >
    <LinearLayout 
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical" 
    android:layout_margin="20dp">
    <TextView
      android:layout_width="fill_parent"
      android:layout_height="wrap_content"
      android:text="It's a PopupWindow" />
    <ImageView
      android:layout_width="fill_parent"
      android:layout_height="wrap_content"
      android:src="@drawable/ic_launcher" />
    <Button
      android:id="@+id/dismiss"
      android:layout_width="fill_parent"
      android:layout_height="wrap_content"
      android:text="Dismiss" />
  </LinearLayout>
</LinearLayout>
</LinearLayout>

メイン アクティビティに次を追加します。

public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.my_options_menu, menu);
    return true;
}

public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case R.id.popup1:
        if (popupCreateList!=null) return true;
        LayoutInflater layoutInflater = (LayoutInflater)getBaseContext().getSystemService(LAYOUT_INFLATER_SERVICE);  
        View popupView = layoutInflater.inflate(R.layout.popup, null);
        popupCreateList = new PopupWindow( popupView,LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);
        popupCreateList.setBackgroundDrawable(new BitmapDrawable());
        popupCreateList.setOutsideTouchable(true);
        popupCreateList.showAtLocation((RelativeLayout)findViewById(R.id.main_activity_layout), Gravity.CENTER, 0, 0); 
        Button btnDismiss = (Button)popupView.findViewById(R.id.dismiss);
        btnDismiss.setOnClickListener(new Button.OnClickListener(){

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                popupCreateList.dismiss();
                popupCreateList=null;
            }});

        return true;
    default:
    return super.onOptionsItemSelected(item);
    }
}

詳細: インスピレーションを得るために、これらの記事を読むことをお勧めします。

http://android-er.blogspot.it/2012/03/example-of-using-popupwindow.html

http://android-ed.blogspot.it/2011/08/using-popupwindow-in-android.html

アンドロイドのポップアップウィンドウ

于 2012-12-30T11:44:01.767 に答える