代码之家  ›  专栏  ›  技术社区  ›  Freelancer

从另一个片段的其他视图控制片段的视图

  •  0
  • Freelancer  · 技术社区  · 6 年前

    我正在写一个使用片段的简单例子。在主要活动中,有两个片段。第一个片段有一些文本视图,第二个片段有一些按钮。当用户单击文本视图时,文本打开按钮将被更改。

    activity\u main.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal"
        tools:context=".MainActivity" android:background="@drawable/ic_launcher_background">
    
        <fragment
            android:id="@+id/MenuFrag"
            android:name="www.myapplication.MenuFrag"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1" />
    
        <fragment
            android:id="@+id/ContentFrag"
            android:name="www.myapplication.ContentFrag"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="3" />
    </LinearLayout>
    

    MainActivity.java

    package www.application;
    
    import android.os.Bundle;
    import android.support.v7.app.AppCompatActivity;
    
    public class MainActivity extends AppCompatActivity implements MenuFrag.IFragmentClickListener{
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
        }
    
        @Override
        public void onMenuItemClick(int position) {
            ContentFrag content = (ContentFrag) getSupportFragmentManager().findFragmentById(R.id.ContentFrag);
            if(content!=null)
                content.updateContent(position);
        }
    }
    

    菜单\u frag.xml(第一个片段)

    <?xml version="1.0" encoding="utf-8"?>
    <FrameLayout 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:background="@color/colorPrimaryDark"
        tools:context=".MenuFrag">
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical">
    
            <TextView
                android:id="@+id/tv1"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:fontFamily="sans-serif-smallcaps"
                android:text="TextView 1"
                android:textSize="20sp"
                android:typeface="serif" />
    
            <TextView
                android:id="@+id/tv2"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:fontFamily="sans-serif-smallcaps"
                android:text="TextView 2"
                android:textSize="20sp"
                android:typeface="serif" />
    
            <TextView
                android:id="@+id/tv3"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:fontFamily="sans-serif-smallcaps"
                android:text="TextView 3"
                android:textSize="20sp"
                android:typeface="serif" />
    
            <TextView
                android:id="@+id/tv4"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:fontFamily="sans-serif-smallcaps"
                android:text="TextView 4"
                android:textSize="20sp"
                android:typeface="serif" />
    
            <TextView
                android:id="@+id/tv5"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:fontFamily="sans-serif-smallcaps"
                android:text="TextView 5"
                android:textSize="20sp"
                android:typeface="serif" />
        </LinearLayout>
    
    </FrameLayout>
    

    MenuFrag.java

    package www.application;
    
    import android.content.Context;
    import android.os.Bundle;
    import android.support.v4.app.ListFragment;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.ListView;
    import android.widget.TextView;
    
    public class MenuFrag extends ListFragment {
        IFragmentClickListener itemfragment;
        TextView tv1;
    
        private View.OnClickListener onclick = new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                     itemfragment.onMenuItemClick(1);
            }
        };
    
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            View view = inflater.inflate(R.layout.menu_frag, container, false);
            tv1= view.findViewById(R.id.tv1);
            tv1.setOnClickListener(onclick);
            return view;
        }
    
        @Override
        public void onAttach(Context context) {
            super.onAttach(context);
            try {
                itemfragment = (IFragmentClickListener) context;
            }catch(ClassCastException e){e.printStackTrace();}
        }
    
        @Override
        public void onListItemClick(ListView l, View v, int position, long id) {
            itemfragment.onMenuItemClick(position);
        }
    
        public interface IFragmentClickListener{
            public void onMenuItemClick(int position);
        }
    }
    

    content\u frag.xml(第二个片段)

    <?xml version="1.0" encoding="utf-8"?>
    <FrameLayout 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:background="@color/colorPrimary"
        tools:context=".ContentFrag">
        <ScrollView
            android:layout_width="match_parent"
            android:layout_height="match_parent">
        <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/btmessage"/>
        </ScrollView>
    
    </FrameLayout>
    

    ContentFrag.java

    package www.application;
    
    import android.os.Bundle;
    import android.support.v4.app.Fragment;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.Button;
    
    public class ContentFrag extends Fragment {
    
        Button btmessage;
    
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            View v = inflater.inflate(R.layout.content_frag, container, false);
            btmessage = v.findViewById(R.id.btmessage);
            return v;
        }
    
        public void updateContent(int position){
            btmessage.setText("You clicked !");
        }
    }
    

    我没有编写控制按钮的操作,只是生成onclick事件。但是,我有一个错误。请帮我修正错误,继续完成我的任务。

    E/AndroidRuntime:致命异常:main java.lang.RuntimeException:无法启动activity ComponentInfo{www.myapplication/www.myapplication.MainActivity}: android.view.InflateException:二进制XML文件行#10:错误 膨胀类碎片 在android.app.ActivityThread.handleLaunchActivity(ActivityThread。java:2360) 在android.app.ActivityThread.access$800(ActivityThread.com)。java:144) 在android.app.ActivityThread$H.handleMessage上。java:1278) 在android.os.Handler.dispatchMessage(Handler。java:102) 在android.os.Looper.loop(Looper。java:135) 位于java.lang.reflect.Method.invoke(本机方法) 在java.lang.reflect.Method.invoke(方法。java:372) 在com.android.internal.os.ZygoteInit.main(ZygoteInit。java:694) 在android.view.LayoutInflater.createViewFromTag(LayoutInflater。java:763) 在android.view.LayoutInflater.rInflate(LayoutInflater。java:806) 在android.view.LayoutInflater.inflate(LayoutInflater。java:414) 在android.view.LayoutInflater.inflate(LayoutInflater。java:365) 在android.support.v7.app.AppCompatDelegateImpl.setContentView(AppCompatDelegateImpl。java:469) 在www.myapplication.MainActivity.onCreate(主要活动。java:11) 在android.app.Activity.performCreate(Activity。java:5937) 在android.app.Instrumentation.callActivityOnCreate(Instrumentation。java:1105) 在android.app.ActivityThread.performLaunchActivity(ActivityThread。java:2251) 在android.app.ActivityThread.handleLaunchActivity(ActivityThread。java:2360) 在android.app.ActivityThread.access$800(ActivityThread.com)。java:144) 在android.os.Handler.dispatchMessage(Handler。java:102) 在android.os.Looper.loop(Looper。java:135) 位于java.lang.reflect.Method.invoke(本机方法) 在java.lang.reflect.Method.invoke(方法。java:372) 在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit。java:899) 原因:java.lang.RuntimeException:您的内容必须具有id属性为“android.R.id.list”的ListView 在android.support.v4.app.ListFragment.onViewCreated(ListFragment。java:150) 在android.support.v4.app.FragmentManagerImpl.ensureInflatedFragmentView(FragmentManager。java:1695) 在android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager。java:1431) 在android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager。java:1684) 在android.support.v4.app.FragmentManagerImpl.onCreateView(FragmentManager。java:3745) 在android.support.v4.app.FragmentController.onCreateView(FragmentController。java:120) 在android.view.LayoutInflater.rInflate(LayoutInflater。java:806) 在android.view.LayoutInflater.inflate(LayoutInflater。java:504) 在android.view.LayoutInflater.inflate(LayoutInflater。java:414) 在android.view.LayoutInflater.inflate(LayoutInflater。java:365) 在android.app.Activity.performCreate(Activity。java:5937) 在android.app.ActivityThread.performLaunchActivity(ActivityThread。java:2251) 在android.app.ActivityThread.handleLaunchActivity(ActivityThread。java:2360) 在android.app.ActivityThread.access$800(ActivityThread.com)。java:144) 在android.os.Handler.dispatchMessage(Handler。java:102) 在android.app.ActivityThread.main(ActivityThread。java:5221) 位于java.lang.reflect.Method.invoke(本机方法) 在java.lang.reflect.Method.invoke(方法。java:372) 在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit。java:899) 在com.android.internal.os.ZygoteInit.main(ZygoteInit。java:694)

    1 回复  |  直到 6 年前
        1
  •  2
  •   Man    6 年前

    问题出在MenuFrag身上 Fragment ,初始化 TextView
    ie公司 tv1= getActivity().findViewById(R.id.tv1);

    onCreateView()

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.menu_frag, container, false);
        tv1 = view.findViewById(R.id.tv1);
        tv1.setOnClickListener(onclick);
        return view;
    } 
    

    当你打电话的时候 getActivity().findViewById