onclick事件不能替换片段

时间:2014-07-18 19:08:41

标签: android android-fragments

我有一个片段活动。 单击片段元素后,将触发onclick事件并使该活动替换片段。

奇怪的是,事件是在活动类上触发的,但这不是主要问题。

在我刚创建的第二个活动中,我在xml上设置onclick事件,但它没有被触发。我也尝试在活动上放置相同的处理程序(因为它适用于第一个片段),但它没有帮助。

总结一下,我有3个布局:活动,第一个片段作为创建的活动加载,第二个片段在第一个片段的点击上被替换。

2个类:Activity类(第一个片段没有类),第二个片段类包含处理程序。

我觉得应用程序的构造搞砸了,所以不要吝啬...

这是代码:

活性:

 <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/chat_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:ignore="MergeRootFrame" 
        />


    public class Chat extends Activity {

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_chat);
            if (savedInstanceState == null) {
                getFragmentManager().beginTransaction()
                        .add(R.id.chat_container, new PlaceholderFragment())
                        .commit();
            }
        }


        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            // Inflate the menu; this adds items to the action bar if it is present.
            getMenuInflater().inflate(R.menu.chat, menu);
            return true;
        }

        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            // Handle action bar item clicks here. The action bar will
            // automatically handle clicks on the Home/Up button, so long
            // as you specify a parent activity in AndroidManifest.xml.
            int id = item.getItemId();
            if (id == R.id.action_settings) {
                return true;
            }
            return super.onOptionsItemSelected(item);
        }

        /**
         * A placeholder fragment containing a simple view.
         */
        public static class PlaceholderFragment extends Fragment {

            public PlaceholderFragment() {
            }

            @Override
            public View onCreateView(LayoutInflater inflater, ViewGroup container,
                    Bundle savedInstanceState) {
                View rootView = inflater.inflate(R.layout.fragment_chat, container, false);
                return rootView;
            }
        }

        public void contactClicked(View v){
            Fragment fragment = new ConversationFragment();
            FragmentTransaction transaction = getFragmentManager().beginTransaction();

            transaction.replace(R.id.chat_container, fragment);

            transaction.addToBackStack(null);

            transaction.commit();
        }

        public void click(View v){
            Toast.makeText(this, "click", Toast.LENGTH_LONG);
         }
    }

第一段:

<LinearLayout
    android:id="@+id/main"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_alignParentTop="true"
    android:orientation="vertical" xmlns:android="http://schemas.android.com/apk/res/android">

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:onClick="contactClicked" >

        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:src="@drawable/ic_launcher"
            android:contentDescription="contactPicture" />

        <TextView
            android:layout_width="112dp"
            android:layout_height="wrap_content"
            android:text="contactName" />

    </LinearLayout>

</LinearLayout>

第二个片段

<LinearLayout
    android:id="@+id/conversation"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_alignParentLeft="true"
    android:layout_alignParentTop="true"
    android:orientation="vertical" xmlns:android="http://schemas.android.com/apk/res/android">

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:gravity="right"
        android:text="koko"
        android:onClick="click" />

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:gravity="left"
        android:text="MMMMM" />

</LinearLayout>




public class ConversationFragment extends Fragment {

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            // Inflate the layout for this fragment
            return inflater.inflate(R.layout.fragment_conversation, container, false);
        }

        public void click(View v){
            Toast.makeText(getActivity(), "click", Toast.LENGTH_LONG);
         }
}

感谢到目前为止阅读的努力...

2 个答案:

答案 0 :(得分:1)

我确信您说的是ConversationFragment中定义的以下点击事件未被执行。

public void click(View v){
        Toast.makeText(getActivity(), "click", Toast.LENGTH_LONG);
}

如果是这种情况,则必须在父Activity中声明此方法,以替换片段。总而言之,android:onClick直接适用于Activity。

或者如果要为视图定义单击侦听器,则可以使用片段本身中的setOnClickListener设置onClickListener。

答案 1 :(得分:0)

将您的方法名称从点击更改为contactClicked

public void contactClicked(View v){
        Toast.makeText(getActivity(), "click", Toast.LENGTH_LONG);
}