【问题标题】:Access method from Dialog to MainActivity从Dialog到MainActivity的访问方法
【发布时间】:2016-12-26 19:48:34
【问题描述】:

我有一个主 Activity,我在其中创建了一个 ViewPager,它实例化了 3 个其他片段。其中之一是 GridView,当用户单击一个项目时会出现一个弹出窗口。然后,在这个弹出窗口中,我有一个简单的按钮。

我想要做的是:当用户单击此按钮时,我想访问我的主 Activity 中的一个方法(应该更改我的 ViewPager 的当前项),然后关闭弹出窗口。

我尽我所能,但我无法做到这一点......我可以在弹出窗口上设置点击事件并轻松关闭它,但我没有找到如何访问方法(甚至是变量) 从我的弹出窗口到我的主要活动。

我会将我最相关的代码放在这里,以便您了解我的类的结构(希望...)。

我的主要活动:

public class MainActivity extends FirstActivity{
private ViewPager mViewPager;

@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mViewPager = (ViewPager) findViewById(R.id.viewpager);

    // Set an Adapter on the ViewPager
    mViewPager.setAdapter(new MainActivity_Adapter(getSupportFragmentManager()));

public void onSaveInstanceState(Bundle savedInstanceState)
{
    menuBar.onSaveInstanceState(savedInstanceState);
}}

我的 ViewPager 活动:

public class MainActivity_Adapter extends FragmentPagerAdapter{
public MainActivity_Adapter(FragmentManager fm)
{
    super(fm);
}

@Override
public Fragment getItem(int position)
{
    // Set the color background for each page
    switch (position)
    {
        case 0:
            return MainActivity_Inventory.newInstance();
        case 1:
            return MainActivity_Map.newInstance();
        default:
            return MainActivity_AR.newInstance();
    }
}

// The number of Splash Screens to display
@Override
public int getCount()
{
    return 3;
}}

我的“库存”片段

public class MainActivity_Inventory extends Fragment implements View.OnClickListener{
public static MainActivity_Inventory newInstance()
{
    MainActivity_Inventory frag = new MainActivity_Inventory();
    Bundle b = new Bundle();
    frag.setArguments(b);
    return frag;
}

@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
    // Select the layout
    int layout;
    layout = R.layout.activity_inventory_01;

    // Inflate the layout resource file
    View view = getActivity().getLayoutInflater().inflate(layout, container, false);

    // Set the grid view
    GridView gridview = (GridView) view.findViewById(R.id.inventory_gridView);
    gridview.setAdapter(new InventoryImageAdapter(super.getActivity()));

    gridview.setOnItemClickListener(new AdapterView.OnItemClickListener()
    {
        public void onItemClick(AdapterView parent, View v, int position, long id)
        {
            // Create a popup to show item details
            createPopup();
        }
    });

    return view;
}

@Override
public void onViewCreated(View view, Bundle savedInstanceState)
{
    super.onViewCreated(view, savedInstanceState);
}

public void createPopup()
{
    DialogFragment newFragment = new PopupActivity_Inventory();
    newFragment.show(getFragmentManager(), "itemDetails");
}

@Override
public void onClick(View v)
{

}}

还有我的弹出对话框片段:

public class PopupActivity_Inventory extends DialogFragment{
@Override
public Dialog onCreateDialog(final Bundle savedInstanceState)
{
    // Build the alert dialog
    final Dialog dialog = new Dialog(this.getActivity());

    // Get the layout inflater
    final LayoutInflater inflater = getActivity().getLayoutInflater();

    // Set up the dialog box
    dialog.setContentView(inflater.inflate(R.layout.activity_inventory_popup_01, null));
    dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
    dialog.getWindow().setGravity(Gravity.TOP);
    //dialog.getWindow().getAttributes().y = 100;

    (dialog.findViewById(R.id.brick_button_01)).setOnClickListener(new View.OnClickListener()
    {
        public void onClick(View view)
        {
            // When button is clicked, ACCESS MAIN ACTIVITY!


            dialog.dismiss();
        }
    });

    return dialog;
}}

我真的希望你能帮我解决这个问题……我真的需要让它工作。非常感谢!

如果您需要更多详细信息或解释,请告诉我。

【问题讨论】:

标签: java android android-fragments methods dialog


【解决方案1】:

最好的办法是使用 EventBus 库。我有一个演示应用程序,您可以在其中使用 EventBus 从应用程序内的任何位置将项目添加到 RecyclerView。您可以将其用作参考来简单地执行其他操作而不是当前任务。这是回购的链接:

https://github.com/code-crusher/android-demos/tree/master/EventBusDemo

如果你想了解它是如何工作的,你可以参考我的文章,它解释了如何让这样的交流变得简单:

https://medium.com/@code_crusher/eventbus-for-android

希望对您有所帮助。快乐编码:)

【讨论】:

    【解决方案2】:

    阅读此https://developer.android.com/training/basics/fragments/communicating.html

    寻找“为了允许 Fragment 与其 Activity 进行通信,您可以在 Fragment 类中定义一个接口并在 Activity 中实现它......”

    实现它的另一种方法是使用 EventBus 并通过 Fragments 发布事件以被 Activities 捕获。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-13
      • 1970-01-01
      • 2017-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多