【问题标题】:How to link and image to another xml layout?如何链接和图像到另一个 xml 布局?
【发布时间】:2018-02-20 12:21:46
【问题描述】:

我是 android 新手,需要一些帮助。我有一个名为 fragment_home.xml 的 xml 布局,其中包含一些图像。当用户点击时,我想将用户重定向到另一个页面(fragment_about_sl.xml)一张图片。请告诉我怎么做以及在哪里放置代码。

fragment_home.xml(图像布局)

<LinearLayout
android:id="@+id/home"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
tools:context="com.example.sloid.destinations.navigationdrawerfragments.homeFragment"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ScrollView
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:gravity="center_horizontal">

        <ImageView
            android:id="@+id/aboutslbtn"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:adjustViewBounds="true"
            android:layout_marginTop="10dp"
            android:layout_marginBottom="10dp"
            android:src="@drawable/aboutsl"
            />
        <ImageView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:adjustViewBounds="true"
            android:layout_marginBottom="10dp"
            android:src="@drawable/toplandmarks"
            />

    </LinearLayout>
</ScrollView>
</LinearLayout>

fragment_about_sl.xml(点击图片后应该重定向的布局)

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/aboutslscrollview"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.sloid.destinations.navigationdrawerfragments.aboutSLFragment">

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">


    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <android.support.v4.view.ViewPager
            android:id="@+id/viewPager"
            android:layout_width="match_parent"
            android:layout_height="250dp" />

        <LinearLayout
            android:id="@+id/SliderDots"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignBottom="@id/viewPager"
            android:layout_marginBottom="20dp"
            android:gravity="center_horizontal"
            android:orientation="horizontal" />


    </RelativeLayout>


</LinearLayout>

</ScrollView>

如有必要,我还添加了 java 文件。

homeFragment.java(fragment_home.xml 的 java 文件)

public class homeFragment extends Fragment {


public homeFragment() {
    // Required empty public constructor
}


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

@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    //you can set the title for your toolbar here for different fragments different titles
    getActivity().setTitle("Destinations");
}

}

aboutSLFragment.java(fragment_about_sl.xml 的 java 文件)

public class aboutSLFragment extends Fragment{

ViewPager viewPager;
LinearLayout sliderDotspanel;
private int dotscount;
private ImageView[] dots;
TextView aboutsltext;
Button readmorebtn;

public aboutSLFragment() {
    // Required empty public constructor
}

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

    View rootView = inflater.inflate(R.layout.fragment_about_sl, container, false);
    viewPager = (ViewPager) rootView .findViewById(R.id.viewPager);

    sliderDotspanel = (LinearLayout)rootView.findViewById(R.id.SliderDots);

    ViewPagerAdapter viewPagerAdapter = new ViewPagerAdapter(getContext());

    viewPager.setAdapter(viewPagerAdapter);

    dotscount = viewPagerAdapter.getCount();
    dots = new ImageView[dotscount];

    for(int i = 0; i < dotscount; i++){

        dots[i] = new ImageView(getContext());
        dots[i].setImageDrawable(ContextCompat.getDrawable(getContext(), R.drawable.non_active_dot));

        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);

        params.setMargins(8, 0, 8, 0);

        sliderDotspanel.addView(dots[i], params);

    }

    dots[0].setImageDrawable(ContextCompat.getDrawable(getContext(), R.drawable.active_dot));

    viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

        }

        @Override
        public void onPageSelected(int position) {

            for(int i = 0; i< dotscount; i++){
                dots[i].setImageDrawable(ContextCompat.getDrawable(getContext(), R.drawable.non_active_dot));
            }

            dots[position].setImageDrawable(ContextCompat.getDrawable(getContext(), R.drawable.active_dot));

        }

        @Override
        public void onPageScrollStateChanged(int state) {

        }
    });

    aboutsltext=(TextView)rootView.findViewById(R.id.aboutsltext);
    readmorebtn=(Button)rootView.findViewById(R.id.readmorebtn);
    readmorebtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            if (readmorebtn.getText().toString().equalsIgnoreCase("Read More"))
            {
                aboutsltext.setMaxLines(Integer.MAX_VALUE);//your TextView
                readmorebtn.setText("Read Less");
            }
            else
            {
                aboutsltext.setMaxLines(3);//your TextView
                readmorebtn.setText("Read More");
            }
        }
    });

    // Inflate the layout for this fragment
    return rootView;
}

@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    //you can set the title for your toolbar here for different fragments different titles
    getActivity().setTitle("About Sri Lanka");
}

添加代码以更改片段

 rootView.findViewById(R.id.aboutslbtn).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Fragment fragment = new aboutSLFragment();
            FragmentManager fragmentManager = getActivity().getSupportFragmentManager();
            FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
            fragmentTransaction.replace(R.id.home, fragment);
            fragmentTransaction.addToBackStack(null);
            fragmentTransaction.commit();
        }
    });

日志猫

 30388-30388/com.example.sloid.destinations E/AndroidRuntime: FATAL EXCEPTION: main
                                                                            Process: com.example.sloid.destinations, PID: 30388
                                                                            java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.sloid.destinations/com.example.sloid.destinations.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.view.View.findViewById(int)' on a null object reference
                                                                                at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2702)
                                                                                at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2767)
                                                                                at android.app.ActivityThread.access$900(ActivityThread.java:177)
                                                                                at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1449)
                                                                                at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                                at android.os.Looper.loop(Looper.java:145)
                                                                                at android.app.ActivityThread.main(ActivityThread.java:5951)
                                                                                at java.lang.reflect.Method.invoke(Native Method)
                                                                                at java.lang.reflect.Method.invoke(Method.java:372)
                                                                                at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399)
                                                                                at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)
                                                                             Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.view.View.findViewById(int)' on a null object reference
                                                                                at com.example.sloid.destinations.navigationdrawerfragments.homeFragment.onCreateView(homeFragment.java:30)
                                                                                at android.support.v4.app.Fragment.performCreateView(Fragment.java:2354)
                                                                                at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1419)
                                                                                at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1740)
                                                                                at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1809)
                                                                                at android.support.v4.app.BackStackRecord.executeOps(BackStackRecord.java:799)
                                                                                at android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2580)
                                                                                at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2367)
                                                                                at android.support.v4.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2322)
                                                                                at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2229)
                                                                                at android.support.v4.app.FragmentManagerImpl.dispatchStateChange(FragmentManager.java:3221)
                                                                                at android.support.v4.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManager.java:3171)
                                                                                at android.support.v4.app.FragmentController.dispatchActivityCreated(FragmentController.java:192)
                                                                                at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:560)
                                                                                at android.support.v7.app.AppCompatActivity.onStart(AppCompatActivity.java:177)
                                                                                at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1234)
                                                                                at android.app.Activity.performStart(Activity.java:6329)
                                                                                at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2665)
                                                                                at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2767) 
                                                                                at android.app.ActivityThread.access$900(ActivityThread.java:177) 
                                                                                at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1449) 
                                                                                at android.os.Handler.dispatchMessage(Handler.java:102) 
                                                                                at android.os.Looper.loop(Looper.java:145) 
                                                                                at android.app.ActivityThread.main(ActivityThread.java:5951) 
                                                                                at java.lang.reflect.Method.invoke(Native Method) 
                                                                                at java.lang.reflect.Method.invoke(Method.java:372) 
                                                                                at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399) 

【问题讨论】:

  • 我已经添加了一段代码,但是有一个错误我无法解决。错误是,只要我将 aboutSLFragment 添加到 Fragment fragment new aboutSLFragment() 它就会给出并且错误称为 unreachable声明使这段代码中的所有行都用红色下划线。请告诉我该怎么办?
  • 确保导入的 Fragment 用于替换 Fragment 和 aboutFragment 都支持 v4 的 Fragment
  • 我发现了错误,是在return inflater.inflate(R.layout.fragment_home, container, false);后面加了如下代码造成的。现在解决了,但是现在又出现了一个错误,你能检查一下吗,我已经添加了 logcat

标签: java android xml image


【解决方案1】:

只需向这些图像添加 id 并处理片段内的 onclick 事件。您可以使用findViewById(R.id.'yourId'); 找到图像视图

以及 onClick 监听器集:view.setOnClickListener(...);

【讨论】:

    【解决方案2】:

    根据My comment

    参考:Fragment replace

     Fragment fragment = new aboutSLFragment();
     FragmentManager fragmentManager = getActivity().getSupportFragmentManager();
     FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
     fragmentTransaction.replace(R.id.home, fragment);
     fragmentTransaction.addToBackStack(null);
     fragmentTransaction.commit();
    

    教程:https://www.javacodegeeks.com/2013/06/android-fragment-transaction-fragmentmanager-and-backstack.html

    【讨论】:

    • 非常感谢 :) 编码愉快 :)
    • 好的,感谢 vishva 的大力支持,因为只有你我才能够解决这个问题,谢谢
    【解决方案3】:

    你是android新手吧,首先你需要检查Fragment detail

    当您提问时,您需要 @Vishva Dave 所说的 replaceadd 片段

    Follow this link

    private void loadFragment(Fragment fragment) {
    
    // create a FragmentManager
    FragmentManager fm = getFragmentManager();
    
    // create a FragmentTransaction to begin the transaction and replace the Fragment
    FragmentTransaction fragmentTransaction = fm.beginTransaction();
    
    // replace the FrameLayout with new Fragment
    fragmentTransaction.replace(R.id.frameLayout, fragment);
    
    fragmentTransaction.commit(); // save the changes
    }
    

    【讨论】:

    • 我添加了一段代码,但有一个错误我无法解决。错误是,只要我将 aboutSLFragment 添加到 Fragment fragment new aboutSLFragment() 它就会给出并且错误称为 unreachable声明使这段代码中的所有行都用红色下划线。请告诉我该怎么办?
    【解决方案4】:

    首先您需要将android:id="@+id/imageId" 添加到xml 中的&lt;ImageView ...,然后在您的homefragment 中添加此代码:

    public class homeFragment extends Fragment {
    View rootView;
    
    public homeFragment() {
    // Required empty public constructor
    }
    
    
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
        rootView = inflater.inflate(R.layout.fragment_home, container, false);
        rootView.findViewById(R.id.imageId).setOnClickListener(new OnClickListener(){
            // go to the other fragment using fragmentTransaction
        });
        return rootView;
    }
    
    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
    //you can set the title for your toolbar here for different fragments 
    different titles
        getActivity().setTitle("Destinations");
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-30
      • 1970-01-01
      • 1970-01-01
      • 2021-09-23
      • 1970-01-01
      相关资源
      最近更新 更多