簡體   English   中英

將ratingBar中的FLOAT值從一個片段傳遞到另一個片段

[英]Passing a FLOAT value from a ratingBar from one fragment to another

我的目標:

大家好,我會盡力詳細解釋所有內容。

我有兩個片段和一項主要活動。 我想要達到的目的是,讓用戶從評分欄中選擇一個評分。 將等級保存到變量中,並在第二個片段中顯示該值。

我嘗試使用IntentBundle實現此Intent ,但是它在啟動時使我的應用程序崩潰。 在應用程序中,我有一個帶有兩個標簽的滑動tabLayout 選項卡一鏈接到OneFargment.java ,選項卡二鏈接到TwoFragment.java

我覺得在這里使用接口的方法行不通,因為每個片段都有不同的布局。 任何幫助或指導將不勝感激。 如果你們需要我發布XML文件的代碼,請告訴我。

I am confused as how to recieve the values in my main activity, it seems that I need to define an ID to a fragment, but I dont have an id for fragment as each fragment has its own seperate layout file.

下面是我所有文件的代碼。

OneFragment.java

    package tanav.sharma;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.RatingBar;
import android.widget.TextView;
import android.widget.Toast;


public class OneFragment extends Fragment {

    OnFragmentSendVal vSendVal;
    private RatingBar ratingBar;
    private TextView txtRatingValue;

    public interface OnFragmentSendVal{
        public void onSentVal(float value);
    }

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

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        try{
            vSendVal = (OnFragmentSendVal)activity;
        }catch (ClassCastException e){
            throw new ClassCastException(activity.toString() + " must implement OnFragmentSendVal");
        }
    }

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

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

        addListenerOnRatingBar(view);
        return view;
    }

    public void addListenerOnRatingBar(View v) {

        ratingBar = (RatingBar) v.findViewById(R.id.ratingBar);
        txtRatingValue = (TextView) v.findViewById(R.id.value);

        //if rating value is changed,
        //display the current rating value in the result (textview) automatically
        ratingBar.setOnRatingBarChangeListener(new RatingBar.OnRatingBarChangeListener() {
            public void onRatingChanged(RatingBar ratingBar, float rating,
                                        boolean fromUser) {



                float val = rating;
                vSendVal.onSentVal(val);
                //txtRatingValue.setText(String.valueOf(rating));

            }
        });
    }



}

TanavActivity.java

package tanav.sharma;

import android.content.Intent;
import android.support.v4.app.Fragment;
import android.content.DialogInterface;
import android.support.design.widget.TabLayout;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.Toolbar;
import java.util.ArrayList;
import java.util.List;

import android.view.View;
import android.widget.Button;
import android.widget.RatingBar;
import android.widget.TextView;




public class TanavActivity extends AppCompatActivity implements OneFragment.OnFragmentSendVal {

    RatingBar rb;
    TextView result;

    private Toolbar toolbar;
    private TabLayout tabLayout;
    private ViewPager viewPager;
    private int[] tabIcons = {
            R.drawable.ic_action_pro,
            R.drawable.ic_action_web
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_tanav);


        toolbar = (Toolbar)findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        /**
         * This button is responsible for taking the user back
         * to the main activity. Preventing the user from pressing
         * the back key multiple times.
         */
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);

        viewPager = (ViewPager)findViewById(R.id.viewpager);
        setupViewPager(viewPager);

        tabLayout = (TabLayout)findViewById(R.id.tabs);
        tabLayout.setupWithViewPager(viewPager);
        setupTabIcons();

        tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {

            int count_image = 0;
            int count_web = 0;
            @Override
            public void onTabSelected(TabLayout.Tab tab) {
                int position = tab.getPosition();
                if(position == 0){

                    count_image = count_image + 1;
                    TextView counter = (TextView) findViewById(R.id.counter);
                    counter.setText(Integer.toString(count_image));

                }else if(position == 1){
                    //count_web = count_web + 1;
                }
            }

            @Override
            public void onTabUnselected(TabLayout.Tab tab) {

            }

            @Override
            public void onTabReselected(TabLayout.Tab tab) {
                count_image = count_image + 1;
                TextView counter = (TextView) findViewById(R.id.counter);
                counter.setText(Integer.toString(count_image));
            }
        });

    }



    private void setupTabIcons(){
        tabLayout.getTabAt(0).setIcon(tabIcons[0]);
        tabLayout.getTabAt(1).setIcon(tabIcons[1]);
    }

    private void setupViewPager(ViewPager viewPager){
        ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
        adapter.addFragment(new OneFragment(), getApplicationContext().getString(R.string.tanav));
        adapter.addFragment(new TwoFragment(), getApplicationContext().getString(R.string.sharma));
        viewPager.setAdapter(adapter);
    }

    @Override
    public void onSentVal(float value) {

    }


    class ViewPagerAdapter extends FragmentPagerAdapter{
        private final List<Fragment> mFragmentList = new ArrayList<>();
        private final List<String> mFragmentTitleList = new ArrayList<>();

        public ViewPagerAdapter(FragmentManager manager) {
            super(manager);
        }

        @Override
        public Fragment getItem(int position) {
            return mFragmentList.get(position);
        }

        @Override
        public int getCount() {
            return mFragmentList.size();
        }

        public void addFragment(Fragment fragment, String title) {
            mFragmentList.add(fragment);
            mFragmentTitleList.add(title);
        }

        @Override
        public CharSequence getPageTitle(int position) {
            return mFragmentTitleList.get(position);
        }

    }


    /**
     * This function is responsible for prompting the user with a dialog box,
     * once the hit the back key on the app. Asking for confirmation if they,
     * really want to exit the app. If user selects Yes, the app will quit.
     * If the user selects cancel, the app will continue to run.
     */
    @Override
    public void onBackPressed() {

        CharSequence exit = getApplicationContext().getString(R.string.exit);
        CharSequence exit_message = getApplicationContext().getString(R.string.exit_message);

        new AlertDialog.Builder(this)
                .setTitle(exit)
                .setMessage(exit_message)
                .setNegativeButton(android.R.string.no, null)
                .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {

                    public void onClick(DialogInterface arg0, int arg1) {
                        TanavActivity.super.onBackPressed();
                    }
                }).create().show();
    }


}

TwoFragment.java

package tanav.sharma;

import android.content.Intent;
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.TextView;


public class TwoFragment extends Fragment {
    TextView lblResult;

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

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

    }

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

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

        String starRatings = getArguments().getString("stars");
        lblResult = (TextView)view.findViewById(R.id.lblResult);
        lblResult.setText(starRatings);

        return view;
    }




}

LOGCAT:

11-20 12:12:16.128 19867-19867/tanav.sharma E/AndroidRuntime: FATAL EXCEPTION: main
                                                              Process: tanav.sharma, PID: 19867
                                                              java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.os.Bundle.getString(java.lang.String)' on a null object reference
                                                                  at tanav.sharma.TwoFragment.onCreateView(TwoFragment.java:31)
                                                                  at android.support.v4.app.Fragment.performCreateView(Fragment.java:2080)
                                                                  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1108)
                                                                  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1290)
                                                                  at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:801)
                                                                  at android.support.v4.app.FragmentManagerImpl.execSingleAction(FragmentManager.java:1638)
                                                                  at android.support.v4.app.BackStackRecord.commitNowAllowingStateLoss(BackStackRecord.java:679)
                                                                  at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:143)
                                                                  at android.support.v4.view.ViewPager.populate(ViewPager.java:1240)
                                                                  at android.support.v4.view.ViewPager.populate(ViewPager.java:1088)
                                                                  at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1614)
                                                                  at android.view.View.measure(View.java:20221)
                                                                  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6333)
                                                                  at android.support.design.widget.CoordinatorLayout.onMeasureChild(CoordinatorLayout.java:700)
                                                                  at android.support.design.widget.HeaderScrollingViewBehavior.onMeasureChild(HeaderScrollingViewBehavior.java:90)
                                                                  at android.support.design.widget.AppBarLayout$ScrollingViewBehavior.onMeasureChild(AppBarLayout.java:1364)
                                                                  at android.support.design.widget.CoordinatorLayout.onMeasure(CoordinatorLayout.java:765)
                                                                  at android.view.View.measure(View.java:20221)
                                                                  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6333)
                                                                  at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
                                                                  at android.support.v7.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:135)
                                                                  at android.view.View.measure(View.java:20221)
                                                                  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6333)
                                                                  at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1464)
                                                                  at android.widget.LinearLayout.measureVertical(LinearLayout.java:747)
                                                                  at android.widget.LinearLayout.onMeasure(LinearLayout.java:629)
                                                                  at android.view.View.measure(View.java:20221)
                                                                  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6333)
                                                                  at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
                                                                  at android.view.View.measure(View.java:20221)
                                                                  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6333)
                                                                  at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1464)
                                                                  at android.widget.LinearLayout.measureVertical(LinearLayout.java:747)
                                                                  at android.widget.LinearLayout.onMeasure(LinearLayout.java:629)
                                                                  at android.view.View.measure(View.java:20221)
                                                                  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6333)
                                                                  at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
                                                                  at com.android.internal.policy.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:3111)
                                                                  at android.view.View.measure(View.java:20221)
                                                                  at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2687)
                                                                  at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1640)
                                                                  at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1932)
                                                                  at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1528)
                                                                  at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7564)
                                                                  at android.view.Choreographer$CallbackRecord.run(Choreographer.java:911)
                                                                  at android.view.Choreographer.doCallbacks(Choreographer.java:686)
                                                                  at android.view.Choreographer.doFrame(Choreographer.java:622)
                                                                  at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:897)
                                                                  at android.os.Handler.handleCallback(Handler.java:739)
                                                                  at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                  at android.os.Looper.loop(Looper.java:148)
                                                                  at android.app.ActivityThread.main(ActivityThread.java:7331)
                                                                  at java.lang.reflect.Method.invoke(Native Method)
                                                                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
                                                                at com.android.i

要將數據從OneFragmentTwoFragment您必須使用interface實現交互,並且您不希望立即這樣做,因此只需TwoFragment此鏈接即可與Other Fragments通信並考慮

標題片段為片段一

ArticleFragment作為片段

兩個onListItemClick是您的onRatingChanged

並將int值替換為適當的float參數和方法

但是它會在啟動時使我的應用程序崩潰。

如果您的應用程序崩潰總是將日志記錄在日志中,它會告訴所有人確切的錯誤發生位置。


您可能有多個錯誤,但我從一開始就看到一個邏輯錯誤。

您將值存儲為float

float val = rating;
...
i.putExtra("star",val);

但是您嘗試使用.getStringExtra()來檢索它...

String vals = i.getStringExtra("star");

記住val是一個float而不是一個String ,使用適當的getter:
getFloatExtra()代替。

float val = i.getFloatExtra("star");

除了此處的其他答案以外,以更靈活的方式嘗試使用SharedPreferences或staic變量。 使用這些變量,您可以存儲變量並在需要時檢索它們,而不必立即啟動活動。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM