رفض Android popupwindow عند التبديل إلى علامة تبويب جديدة في الجدولة؟
-
26-09-2019 - |
سؤال
لديّ خريطة كواحدة من أربع علامات تبويب في جدولة. يمكن أن تطلق هذه الخريطة popupwindow وهي أسطورة. يبقى popupwindow على الشاشة ، أعلى الخريطة ، حتى يتم النقر على زر "Show Legend" مرة أخرى (ذهابًا وإيابًا ، إلخ).
المشكلة هي أنه عندما ينتقل المستخدم إلى علامة تبويب أخرى ، يظل Popupwindow ثابتًا على العرض.
لقد حاولت تنفيذ طريقة ONPAUSE () في فئة MAPACTIVY ، ورفضها من هناك. تغلق قوة التطبيق مع هذه الطريقة في مكانها.
أي مساعدة؟ شكرًا!
تحرير: إليك بعض الكود الخاص بي:
في النشاط الرئيسي ، الذي يحدد علامات التبويب الأربعة:
Resources res = getResources(); // Resource object to get Drawables
TabHost tabHost = getTabHost(); // The activity TabHost
TabHost.TabSpec spec; // Reusable TabSpec for each tab
Intent intent; // Reusable Intent for each tab
// Create an Intent to launch an Activity for the tab (to be reused)
intent = new Intent().setClass(this, FirstActivity.class);
// Initialize a TabSpec for each tab and add it to the TabHost
spec = tabHost.newTabSpec("game").setIndicator("First",
res.getDrawable(R.drawable.ic_tab_game))
.setContent(intent);
tabHost.addTab(spec);
// Do the same for the other tabs
intent = new Intent().setClass(this, SecondActivity.class);
spec = tabHost.newTabSpec("alerts").setIndicator("Second",
res.getDrawable(R.drawable.ic_tab_alert))
.setContent(intent);
tabHost.addTab(spec);
intent = new Intent().setClass(this, MapActivity.class);
spec = tabHost.newTabSpec("map").setIndicator("Map",
res.getDrawable(R.drawable.ic_tab_map))
.setContent(intent);
tabHost.addTab(spec);
intent = new Intent().setClass(this, LastActivity.class);
spec = tabHost.newTabSpec("experience").setIndicator("Last",
res.getDrawable(R.drawable.ic_tab_experience))
.setContent(intent);
tabHost.addTab(spec);
tabHost.setCurrentTab(0);
الآن في فصل الخريطة (الذي يمتد النشاط الخبيث):
// Declare the Legend PopupWindow
mapLegendInflater = (LayoutInflater) MapActivity.this
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
mapLegendPopupLayout = mapLegendInflater.inflate(
R.layout.maptablegendpopuplayout, null, false);
mapLegendPopup = new PopupWindow(mapLegendPopupLayout,
(int) (0.45 * getApplicationContext().getResources()
.getDisplayMetrics().widthPixels),
(int) (0.33 * getApplicationContext().getResources()
.getDisplayMetrics().heightPixels), true);
mapLegendPopup.setFocusable(false);
mapLegendPopup.setOutsideTouchable(true);
Boolean legendIsShown = false;
mapLegendButton = (Button) findViewById(R.id.buttonMapLegend);
mapLegendButton.setOnClickListener(mapLegendListener);
private OnClickListener mapLegendListener = new OnClickListener() {
public void onClick(View v) {
// Launch or dismiss the map legend popup
if (legendIsShown) {
mapLegendPopup.dismiss();
mapLegendButton.getBackground().clearColorFilter();
legendIsShown = false;
} else {
mapLegendPopup.showAtLocation(
findViewById(R.id.buttonMapLegend), Gravity.TOP
| Gravity.LEFT, 8,
(int) (0.23 * getApplicationContext().getResources()
.getDisplayMetrics().heightPixels));
mapLegendButton.getBackground().setColorFilter(
new LightingColorFilter(0xFFFFFFFF, 0xFFAA0000));
// mapLegendButton.getBackground().setColorFilter(0xFFFFFF00,
// PorterDuff.Mode.MULTIPLY);
legendIsShown = true;
}
}
};
آمل أن يوفر هذا فكرة عن المكان الذي أكون فيه. كل شيء يعمل بشكل جيد في علامة التبويب الخريطة. فقط عندما يكون لديك الأسطورة معروضة وتبديل علامات تبويب أنه لا يزال يتم عرضه على طرق عرض أخرى.
المحلول
أعلم أنك قلت إن تنفيذ ONPAUSE () لم يعمل من أجلك ، لكنني جربته وتنفيذ onResume () و onPause () في النشاط الخريطة.
كنت بحاجة إلى القيام بعرض
package com.esri.android.tabdemo;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.PopupWindow;
import android.widget.TextView;
import android.widget.Toast;
public class MapActivity extends Activity
{
private TextView textView = null;
private PopupWindow popupWindow = null;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
textView = new TextView(this);
textView.setText("Hello World from MapActivity");
setContentView(textView);
}
@Override
protected void onPause()
{
super.onPause();
if (popupWindow != null)
{
popupWindow.dismiss();
popupWindow = null;
}
}
@Override
protected void onResume()
{
super.onResume();
final Context context = this;
textView.post(
new Runnable()
{
public void run()
{
popupWindow = new PopupWindow(context);
LinearLayout linearLayout = new LinearLayout(context);
linearLayout.setOrientation(LinearLayout.VERTICAL);
Button button = new Button(context);
button.setText("Hello");
button.setOnClickListener(new OnClickListener()
{
public void onClick(View v)
{
Toast.makeText(context, "Hello", Toast.LENGTH_SHORT).show();
}
});
linearLayout.addView(button);
popupWindow.setContentView(linearLayout);
popupWindow.showAtLocation(linearLayout, Gravity.LEFT | Gravity.BOTTOM, 10, 10);
popupWindow.update(256, 64);
}
}
);
}
}
نصائح أخرى
يمكنك بدء popupwindown مثل هذا:
mapLegendPopup = new PopupWindow(this);
mapLegendPopup.setContentView (itemizeView);
mapLegendPopup.setBackgroundDrawable (new BitmapDrawable()); // key is here
mapLegendPopup.setWidth ((int) (0.45 * getApplicationContext().getResources()
.getDisplayMetrics().widthPixels));
mapLegendPopup.setHeight((int) (0.33 * getApplicationContext().getResources()
.getDisplayMetrics().heightPixels));
mapLegendPopup.setFocusable(false);
mapLegendPopup.setOutsideTouchable(true);
يجب عليك إدارة الحوار الخاص بك باستخدام طريقة onCreatedialog () ، على النحو الموصى به من خلال الإطار.
وبهذه الطريقة ، سيصبح حوارك جزءًا من نشاطك وسيفعل ذلك بنفسه.
إذا كنت لا ترغب حقًا في استخدام ذلك (لا يمكنني رؤية أي سبب من الأسباب التي تجعل هذا هو الحال ، ولكن لا يزال) ، فيمكنك استخدام setowneractivity () في مربع الحوار الخاص بك لتعيينه لنشاطك.