繁体   English   中英

单击按钮时从 Fragment 打开 Fragment

[英]Open fragment from Fragment on button click

我在单击按钮时无法从另一个片段中打开一个片段。 一切似乎都有意义(对我而言),我尝试使用我的代码(更改布局,替换片段等),但没有任何效果。

这是我的RoleFragment.java (包含按钮的片段)

public class RolesFragment extends Fragment implements View.OnClickListener {

GridView gridView;
ArrayList<Players> playersList;
MyAdapter adapter;

@Override
public View onCreateView(LayoutInflater inflater,ViewGroup container,
                         Bundle savedInstanceState) {

    View view = inflater.inflate(R.layout.fragment_viewroles, container, false);

    gridView = (GridView) view.findViewById(R.id.gv_players);
    Button nightround = (Button) view.findViewById(R.id.buttonNightRound);

    nightround.setOnClickListener(this);

    DatabaseHelper databaseHelper = new DatabaseHelper(getActivity());
    playersList = new ArrayList<Players>();

    playersList = databaseHelper.getPlayers();
    adapter = new MyAdapter(getActivity(), playersList);
    gridView.setAdapter(adapter);

    return view;
}


@Override
public void onClick(View v) {
    Fragment fragment = null;
    switch (v.getId()) {
        case R.id.buttonNightRound:
            fragment = new NightRound();
            replaceFragment(fragment);
            break;

    }

}

public void replaceFragment(Fragment someFragment) {
    FragmentTransaction transaction = getFragmentManager().beginTransaction();
    transaction.replace(R.id.fragment_container, someFragment);
    transaction.addToBackStack(null);
    transaction.commit();
}

 }

这是我的fragment_viewroles.xml文件。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.tuss.mafia.GameActivity" >

<Button
    android:id="@+id/buttonNightRound"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Night Round"
    android:onClick="FragmentNightRoundClick"
    android:clickable="true"
    android:layout_weight="2"/>


<GridView
    android:id="@+id/gv_players"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:numColumns="auto_fit"
    android:stretchMode="columnWidth"
    android:columnWidth="150dp"
    android:horizontalSpacing="10dp"
    android:verticalSpacing="10dp"
    android:gravity="center"
    android:layout_below="@id/buttonNightRound">
</GridView>

</RelativeLayout>

问题是,当我点击按钮时什么也没有发生。

尝试类似以下内容:

     Fragment fragment = OtherFragment.newInstance();
            android.support.v4.app.FragmentTransaction transaction = getActivity().getSupportFragmentManager().beginTransaction();
            transaction.replace(R.id.container_layout, fragment, "OtherFragment");// give your fragment container id in first parameter
            transaction.addToBackStack(null);  // if written, this transaction will be added to backstack
            transaction.commit();

这里有一些问题。 首先,您必须在您的片段中添加一个 ID 为R.id.fragment_container的容器,例如FrameLayout ,它将存储您的新片段。

如果你想打开一个片段作为一个新的屏幕,你必须把它放在一个新的活动中。 片段是一块屏幕,不应在没有活动或查看寻呼机的情况下使用。

看看 Android 开发者页面: http : //developer.android.com/training/basics/fragments/communicating.html#DefineInterface

基本上,您在 Fragment A 中定义一个接口,并让您的 Activity 实现该接口。 现在您可以在您的 Fragment 中调用接口方法,您的 Activity 将接收该事件。 现在在您的活动中,您可以调用第二个 Fragment 以使用接收到的值更新 textview

// You Activity implements your interface
public class YourActivity implements FragmentA.TextClicked{
    @Override
    public void sendText(String text){
        // Get Fragment B
        FraB frag = (FragB)
            getSupportFragmentManager().findFragmentById(R.id.fragment_b);
        frag.updateText(text);
    }
}


// Fragment A defines an Interface, and calls the method when needed
public class FragA extends Fragment{

    TextClicked mCallback;

    public interface TextClicked{
        public void sendText(String text);
    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);

        // This makes sure that the container activity has implemented
        // the callback interface. If not, it throws an exception
        try {
            mCallback = (TextClicked) activity;
        } catch (ClassCastException e) {
            throw new ClassCastException(activity.toString()
                + " must implement TextClicked");
        }
    }

    public void someMethod(){
        mCallback.sendText("YOUR TEXT");
    }

    @Override
    public void onDetach() {
        mCallback = null; // => avoid leaking, thanks @Deepscorn
        super.onDetach();
    }
}

// Fragment B has a public method to do something with the text
public class FragB extends Fragment{

    public void updateText(String text){
        // Here you have it
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM