পছন্দ স্ক্রিনে কীভাবে একটি বোতাম যুক্ত করা যায়


106

পছন্দসই স্ক্রিনের নীচে একটি বোতাম যুক্ত করার এবং স্ক্রোল করার সময় সেগুলিকে সঠিকভাবে কাজ করার কোনও উপায় আছে কি?


2
আপনি কি পছন্দসই পছন্দ তৈরির দিকে নজর রেখেছেন?
প্রশস্ত

2
ভবিষ্যতের দর্শকদের জন্য, যখন ম্যাক্সের সমাধান কাজ করে, সেখানে বিকল্প বিকল্প রয়েছে: স্ট্যাকওভারফ্লো.com
রেড

উত্তর:


249

পছন্দগুলির চেহারাটি কাস্টমাইজ করার জন্য আরও একটি সমাধান রয়েছে।

বোতামগুলি বা আপনি যা পছন্দসই পছন্দগুলিতে যুক্ত করতে চান তা দিয়ে একটি সাধারণ এক্সএমএল লেআউট ডিজাইন করুন। ListViewআপনার লেআউটে একটি অন্তর্ভুক্ত করুন এবং এটি আইডি দিন @android:id/list

ধরা যাক আমরা লেআউট ফাইলটি কল করি res/layout/main.xml। এটি এর মতো দেখতে পারে:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:orientation="vertical">
    <Button android:text="This is a button on top of all preferences."
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    <ListView android:id="@android:id/list"
              android:layout_width="match_parent"
              android:layout_height="wrap_content" />
</LinearLayout>

আপনার মধ্যে PreferenceActivity, এই দুটি লাইন আপনার onCreate:

addPreferencesFromResource(R.xml.preferences);
setContentView(R.layout.main);

ListViewআপনার লেআউট তারপর পছন্দ স্বাভাবিক ভাবেই সংজ্ঞায়িত দ্বারা প্রতিস্থাপন করা হবে res/xml/preferences.xml


10
তালিকার ভিউয়ের নীচে বোতাম স্থাপন করা হলে কাজ করে না। পছন্দগুলি ক্রিয়াকলাপটি যখন ডায়ালগ থিম ব্যবহার করে তখন কাজ করে না।
গ্রেগ এনিস

11
ডেভেলপার.এন্ড্রয়েড / রেফারেন্স / এ্যান্ড্রয়েড / প্রিফারেন্স / at এ প্রেফারেন্সঅ্যাক্টিভিটি ব্যবহারের সর্বশেষ ডকুমেন্টেশন উল্লেখ করেছে যে সমস্ত নতুন বিকাশের জন্য পছন্দের ফ্রেমটি বাস্তবায়নের পছন্দের উপায়। দেখে মনে হচ্ছে যে প্রদত্ত সমাধানটি এ জাতীয় দৃশ্যে কাজ করবে না।
পঙ্কজ

4
এটি এখনও তালিকার সাথে স্ক্রোল করে না।
সুদর্শন ভাট

7
এই উত্তরটি আসলে আসল প্রশ্নের উত্তর দেয় না বলে কতটা ভোট পেয়ে আমি কিছুটা বিস্মিত হয়েছি। এটি তালিকার সাথে স্ক্রোল করে না এবং উপরের মন্তব্যে উল্লিখিত মত হিসাবে নীচের অংশে বোতামটি রাখলে এটি কার্যকর হয় না।
howettl

1
@ হোয়েটেল কেবলমাত্র ফিলিপ-লেয়ারকে লিস্টভিউ লেআউটে_ মোড়কের_পরে পরিবর্তন করুন
মার্টিন সিএইচ

56

আমি জানি এটি কিছুটা দেরি হয়ে গেছে, তবে আমি সবেমাত্র একটি সমাধান পেয়েছি যা ম্যাক্সের প্রশংসিত সমাধানের চেয়ে ভাল like

আপনি পছন্দসই কার্যকলাপের তালিকার ভিউতে কেবল একটি পাদচরণ (অথবা আপনি যদি শীর্ষে থাকা বোতামটি শীর্ষে রাখতে চান) can

public class MyActivity extends PreferenceActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.preferences);
        ListView v = getListView();
        v.addFooterView(new Button(this));
    }
}

আমি আশা করি এটা কারো সাহায্যে লাগবে.


2
অন্তত এটি ম্যাক্সের সমাধান হিসাবে আরও ভাল বোধ করে কারণ এটি উপাদান আইডির উপর নির্ভর করে না। আসুন এটি কীভাবে ভবিষ্যতের Android এর সংস্করণগুলিতে এটি আচরণ করে তা দেখুন ...
ড্যানিয়েল এফ

@DanielF। ব্রিজটি পৌঁছানো
অবধি

1
আমি ListViewপছন্দসই ফ্রেঞ্চটি পেতে পারি না :(
মাইচা কে

1
না, এটা যে ভাবে কাজ করবে না (কারণ PreferenceFragmentতার নিজস্ব তালিকা আছে), কিন্তু আমি শুধু একটি তৈরি করে এটিকে সমাধান Preferenceএবং একটি সেটিং Intentএটিতে। কোনও বোতাম তৈরি করার দরকার নেই (কমপক্ষে আমার ক্ষেত্রে)
Michał K

1
পছন্দের ফ্রেমক্যাম্প্যাট নিয়ে কাজ করে না, যেহেতু getListView প্রকৃতপক্ষে একটি পুনর্ব্যবহারযোগ্য প্রদর্শন করবে
মউকার

11

নীচের এই উদাহরণটি পৃষ্ঠার নীচে একটি বোতাম রেন্ডার করবে (যদি কেউ এখনও আগ্রহী হন)।

লিনিয়ারলআউটের ক্ষেত্রে আপনি ওজন প্রয়োগ করতে পারেন; এটি প্রয়োজন কারণ তালিকাভিউটি * ফিল_প্যারেন্ট * এ সেট করা আছে। আমি সাধারণত * অ্যান্ড্রয়েড: লেআউট_ ওয়েট * এর যোগ করে এটি করি:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent"
              android:orientation="vertical">
    <ListView android:id="@android:id/list"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent" android:layout_weight="10"/>
    <Button android:text="This is a button on top of all preferences."
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" android:layout_weight="1"/>
</LinearLayout>

নীচের ব্যাখ্যাটি সম্ভবত 100% নয় তবে এটি আপনাকে বুঝতে সহায়তা করবে ...

+-- View Port (linear layout)
| +-- List View (this is where the preferences will go)
| |
| |
| +--
+--
  +--
  | Button (which was pushed out of view by the fillparent of ListView
  +--

আপনি এটিও বলতে পারেন, কারণ বোতামটির ওজন নেই; বোতামটি 0dp উচ্চতায় রেন্ডার করা হয়।

এখন লেআউট_উইগথগুলি যুক্ত করার সাথে সাথে এটি বোতামটি সংক্ষিপ্ত বিবরণ দেয়

+-- View Port (linear layout)
| +-- List View (this is where the preferences will go)
| |
| |
| +--
| +--
| | Button (which was pushed out of view by the fillparent of ListView
| +--
+--

দুঃখিত @ স্টিলথকপ্টার
রনি

7

আসলে, একটি সমাধান আছে। এখানে একটি কোড রয়েছে, আমি আশা করি, এটি যে কারও পক্ষে কার্যকর হবে। দেখতে পর্দার নীচে 3 টি বিকল্প এবং 2 টি বোতামের মতো দেখতে পর্দার সমাধানের চেয়ে পৃথক (সর্বনিম্ন 240 তে টার্গেট করা হয়েছিল)

package com.myapplication.gui;

import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle;
import android.preference.Preference;
import android.preference.PreferenceActivity;
import android.preference.PreferenceScreen;
import android.view.Display;
import android.view.Gravity;
import android.view.WindowManager;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.ScrollView;
import com.myproject.general.HeightListView;

import com.myapplication.R;

public class FilterActivity extends PreferenceActivity {

    private LinearLayout rootView; 
    private LinearLayout buttonView; 
    private Button buttonDone;
    private Button buttonRevert;
    private ListView preferenceView; 
    private LinearLayout gradientView;
    private ScrollView scrollRoot;

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

        Display display = ((WindowManager) getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay(); 
        int height = display.getHeight();
        int width = height > 240 ? display.getWidth() : display.getWidth() - 4;

        scrollRoot = new ScrollView(this);
        scrollRoot.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));

        rootView = new LinearLayout(this); 
        rootView.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); 
        rootView.setOrientation(LinearLayout.VERTICAL);

        buttonView = new LinearLayout(this); 
        buttonView.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
        buttonView.setOrientation(LinearLayout.HORIZONTAL);
        buttonView.setGravity(Gravity.BOTTOM);

        gradientView = new LinearLayout(this);
        gradientView.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
        gradientView.setOrientation(LinearLayout.HORIZONTAL);
        gradientView.setBackgroundResource(R.drawable.gradient);
        gradientView.setPadding(0, 5, 0, 0);
        gradientView.setBackgroundResource(R.drawable.gradient);

        buttonDone = new Button(this); 
        buttonDone.setText(R.string.filterButton_Done); 
        buttonDone.setLayoutParams(new LayoutParams(width/2, LayoutParams.WRAP_CONTENT));
        gradientView.addView(buttonDone);

        buttonRevert = new Button(this); 
        buttonRevert.setText(R.string.filterButton_Revert);
        buttonRevert.setLayoutParams(new LayoutParams(width/2, LayoutParams.WRAP_CONTENT));
        gradientView.addView(buttonRevert);

        buttonView.addView(gradientView);

        preferenceView = new HeightListView(this); 
        preferenceView.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT)); 
        preferenceView.setId(android.R.id.list); 

        PreferenceScreen screen = createPreferenceHierarchy(); 
        screen.bind(preferenceView); 
        preferenceView.setAdapter(screen.getRootAdapter()); 
        rootView.addView(preferenceView);
        rootView.addView(buttonView);

        if (height > 240) {
            this.setContentView(rootView);
        }
        else {
            scrollRoot.addView(rootView);
            this.setContentView(scrollRoot);
        }

        setPreferenceScreen(screen); 
    } 

    private PreferenceScreen createPreferenceHierarchy() {        
        PreferenceScreen root = getPreferenceManager().createPreferenceScreen(this);

        PreferenceScreen pref1 = getPreferenceManager().createPreferenceScreen(this);
        pref1.setKey("pref1");
        pref1.setTitle("Title");
        pref1.setSummary("Summary");
        root.addPreference(pref1); 

        PreferenceScreen pref2 = getPreferenceManager().createPreferenceScreen(this);
        pref2.setKey("pref2");
        pref2.setTitle("Title");
        pref2.setSummary("Summary");
        root.addPreference(pref2); 

        PreferenceScreen pref3 = getPreferenceManager().createPreferenceScreen(this);
        pref3.setKey("pref3");
        pref3.setTitle("Title");
        pref3.setSummary("Summary");
        root.addPreference(pref3); 

        return root; 
    } 
}

2

আপনার কেবল সাধারণ ক্রিয়াকলাপের মধ্যে পছন্দের ফ্রেম ব্যবহার করতে হবে এবং কার্যকলাপের বিন্যাসে বোতামটি যুক্ত করতে হবে।

public class SettingActivity extends Activity {

    UserProfileViewModel userProfileViewModel = null;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_setting);
        getFragmentManager().beginTransaction()
                .replace(R.id.content, new SettingsFragment())
                .commit();

    }

    private class SettingsFragment extends PreferenceFragment {
        public SettingsFragment() {
        }

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

            // Load the preferences from an XML resource
            addPreferencesFromResource(R.xml.pref_main);

        }
    }
}

SettingActivity.java

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <FrameLayout
        android:id="@+id/content"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_above="@+id/buttonSave"/>

    <Button
        android:id="@+id/buttonSave"
        android:text="Save"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true" />
</RelativeLayout>

activity_setting

এখানে চিত্র বর্ণনা লিখুন


আমি এই পরামর্শটি অনুসরণ করেছি, এবং এটি দেখার নীচের অংশে বোতামটি প্রদর্শন করে, তবে এটি পছন্দ তালিকার শীর্ষে সুপারমোজড এবং ক্লিক করা যায় না (অর্থাত্ বোতামটি ক্লিক করা কেবল নীচের পছন্দসই আইটেমটি সক্রিয় করে)।
iaindownie

ক্লিকলিস্টেনারের বোতামটি এই সমাধানটি ব্যবহার করে বরখাস্ত করা হয়নি
de

@rdehuyss কারণ এটিতে আপনার ক্লিক ক্লিক লিস্টেনার যুক্ত করতে হবে buttonSave:)
অ্যালবার্ট

1

কোডটি রনিটির উদাহরণে ক্রিয়াকলাপের মতো দেখতে হবে। আমার উদ্দেশ্যটি ছিল পর্দার নীচের দিকে একটি মেনু রাখা।

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.prefs);
    addPreferencesFromResource(R.xml.prefs);

   /* LayoutInflater CX = getLayoutInflater();
    CX.inflate(R.layout.main,null);*/
    // TODO Auto-generated method stub
}

1
 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <ListView
        android:id="@android:id/list"
        android:layout_width="match_parent"
        android:layout_height="@dimens/listview_height" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:text="This is a button on top of all preferences." />
</RelativeLayout>

আমি @ রনি রেফারেন্স করি, রিলেটিভলআউট ব্যবহার করি এবং তালিকা-দর্শনের লেআউট_ উচ্চতার জন্য উচ্চতা নির্ধারণ করি এবং তারপরে বোতামের লেআউট_লিগান্পিয়ারবটম = "সত্য" সেট করি, এটি পছন্দ স্ক্রিনের নীচে একটি বোতাম রেন্ডার করতে পারে; তারপরে @ ম্যাক্সের উপায়টি ব্যবহার করুন। এটি আমার প্রয়োজনের জন্য কাজ করে।


এটি একটি দুর্দান্ত সমাধান, তবে আপনি বোতামের উপরে তালিকাগুলি সেট করতে ভুলে গেছেন। বর্তমানে, তালিকার আইটেমগুলি বোতামের পিছনে থাকতে পারে, যা এটি শেষ আইটেম হিসাবে প্রদর্শিত না হলে এটি কখনই দৃশ্যমান হবে না এবং তাই ক্লিকযোগ্য।
অ্যান্ড্রয়েড বিকাশকারী

ওহ, হ্যাঁ, আপনি ঠিক বলেছেন, আমি এই কেসটি ভুলে গেছি, কারণ আমার লিস্টভিউটি কেবল 5 টি আইটেম, ধন্যবাদ।
মেজনজাহান

দয়া করে আপনার উত্তর আপডেট করুন, যাতে অন্যের সাথে এই আচরণ না হয়।
অ্যান্ড্রয়েড বিকাশকারী

আমি মনে করি আপনি কিছু বৈশিষ্ট্য এবং আপেক্ষিক লেআউটের শেষ ট্যাগটি ভুলে গেছেন।
অ্যান্ড্রয়েড বিকাশকারী

আসলে, সঠিক তালিকাদর্শন_ উচ্চতা সেট করা আপনার বলা সমস্যার সমাধান করতে পারে।
মেজনজাহান

1

অ্যান্ড্রয়েড স্ট্যান্ডার্ড পদ্ধতির জন্য অ্যাকশন বারে অ্যাকশন বোতাম যুক্ত করাও সম্ভব।

public class PrefActivity extends PreferenceActivity{

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

  @Override
  public boolean onCreateOptionsMenu(Menu menu) {
      // Inflate the menu items for use in the action bar
      MenuInflater inflater = getMenuInflater();
      inflater.inflate(R.menu.preference_header_menu, menu);
      return super.onCreateOptionsMenu(menu);
  }

}


    <?xml version="1.0" encoding="utf-8"?>
       <menu xmlns:android="http://schemas.android.com/apk/res/android">
       <item android:id="@+id/action_add"
           android:icon="@drawable/ic_menu_add_dark"
           android:title="@string/menu_action_add_title"
           android:showAsAction="always"  />

   </menu>

0

পছন্দের ক্রিয়াকলাপে কাস্টম দর্শন এটি অ্যান্ড্রয়েডে পছন্দসই কার্যকলাপে কাস্টম ভিউ যুক্ত করতে সহায়তা করবে।

মেইন.এক্সএমএল তৈরি করুন, কেবলমাত্র প্রয়োজনীয় ভিউ হ'ল আইডি সহ একটি তালিকাভিউ android:id="@android:id/list"

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical" android:layout_width="fill_parent"
        android:layout_height="fill_parent" android:weightSum="1">
        <ListView 
            android:id="@android:id/list" 
            android:layout_weight="1"
            android:layout_width="fill_parent"
                android:layout_height="0dp">
        </ListView>
        <TextView
        android:id="@+id/textView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
</LinearLayout>

কাস্টমপ্রেফারেন্সিসিটি.জভা তৈরি করুন

public class CustomPreferenceActivity extends PreferenceActivity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.main);
                addPreferencesFromResource(R.xml.settings);

                //setup any other views that you have
                TextView textView = (TextView) findViewById(R.id.textView);
textView.setText("View Added");
        }
}

0

আপনার পছন্দ স্ক্রিনে ক্লিকযোগ্য বাটন যুক্ত করার জন্য নিম্নলিখিতটি একটি সহজ সমাধান। এটি সহজ করা হয়েছে কারণ পছন্দগুলি ইতিমধ্যে অ্যান্ড্রয়েডের মধ্যে স্থান সংরক্ষণ করে: উইজেটলআউট এবং বোতামটি অ্যান্ড্রয়েড: অনক্লিকের সাথে ক্লিকগুলি পাস করতে পারে।

প্রথমে সামগ্রীতে একটি বাটন.এক্সএমএল তৈরি করুন

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
    android:text="BUTTON"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/button"
    android:onClick="onButtonClick"/>
</LinearLayout>

এখন আপনার পছন্দসই। Xml এ, পছন্দটি যুক্ত করুন

<Preference
    android:key="button"
    android:title="Title"
    android:summary="Summary"
    android:widgetLayout="@layout/button" />

আপনার পছন্দঅ্যাক্টিভিটিতে এখন কেবলমাত্র অনটন বাটিক্লিক সদস্য থাকতে হবে

public class MainActivity extends PreferenceActivity {

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

    addPreferencesFromResource(R.xml.main_preferences);


}

public void onButtonClick(View v) {
    Log.d("Button", "Yeah, button was clicked");
}
}

0

preferences.xml:

    <Preference
        android:key="clearAllData"
        android:title="@string/settings_clear_all_data">
    </Preference>

SettingsFragment.java:

public class SettingsFragment extends PreferenceFragment {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.settings);

        Preference clearAllData = (Preference) findPreference("clearAllData");

        // setup buttons
        final Context context = getActivity();
        clearAllData.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {

            @Override
            public boolean onPreferenceClick(Preference preference) {
                ...
            }
    }

}

0

আমি PreferenceScreenকাস্টম লেআউটের ভিতরে ধারকটি 'মোড়ানোর' জন্য তৈরি যে কোনও বিন্যাস (তারপরে নীচে একটি বোতাম যুক্ত করা ListView) বাস্তবে কাজ করে নি সে হিসাবে উপরের সমস্ত উত্তর অ-ব্যবহারযোগ্য বলে খুঁজে পেয়েছি ।

তারা কেবল পছন্দ তালিকার শীর্ষে কাস্টম বিন্যাস (ভাসমান) ওভারলাইড করে এবং (যেমন) একটি নতুন কাস্টম বোতামটি কেবল বোতামের নীচে পছন্দকেই অনুরোধ করবে।

যাইহোক, আমি এই সমাধানটি ব্যবহার করেছি যখন পছন্দগুলি তালিকার নীচে একটি বোতাম যুক্ত করার জন্য ট্রিট কাজ করে PreferenceFragment

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.