সাপোর্ট লাইব্রেরি v21 এ আপগ্রেড করার পরে পছন্দ অ্যাক্টিভিটিতে কোনও অ্যাকশনবার নেই


83

আমি সমর্থন লাইব্রেরি v21 এ আপগ্রেড করার পরে আমার আমার অ্যাকশনবারটি PreferenceActivityচলে গেছে।

আমার থিমটিতে আবার সক্রিয় করার জন্য আমি কিছু বৈশিষ্ট্য মিস করেছি? ব্ল্যাক অ্যাকশনবারের সাথে আমারও তেমন কিছু সমস্যা হয়েছিল ।

আমি এটিকে Toolbarমূল বিন্যাসে যুক্ত করে কিছুটা হ্যাচিশ যুক্ত করার চেষ্টা করেছি, তবে এটি আশানুরূপভাবে কার্যকর হয়নি।


আপনার পছন্দসই খণ্ডটি ব্যবহার করা উচিত: বিকাশকারী
জ্যারেড বুরোস

4
@ জ্যারেডবুরোস আপনি পছন্দসই ফ্রেমেগমেন্ট ব্যবহার করতে পারবেন না 3.0 যদিও
tyczj

4
আমি সেগুলিও ব্যবহার করছি। AFIK আমার পছন্দের ক্রিয়াকলাপের সাথে লিঙ্ক করতে হবে যা পছন্দসন্ধিগুলি ব্যবহার করে। তবে টাইসিজ্য হিসাবে উল্লেখ করা হয়েছে যে উত্তরাধিকারের সমর্থনের জন্যও আমার এটি দরকার।
rekire

4
টুলবারটি কেবল একটি দর্শন। আপনি এটি যে কোনও জায়গায় যুক্ত করতে পারেন।
জারেড বুরোজ

4
আমি এখানে যে উদাহরণটি তৈরি করেছি তা আপনি দেখতে পারেন: github.com/AndroidDeveloperLB/MaterialPreferencesLibrary
অ্যান্ড্রয়েড বিকাশকারী

উত্তর:


170

দয়া করে গিটহাব রেপোটি সন্ধান করুন: এখানে


আপনার নিজস্ব কোডের সাথে খুব মিল তবে সেট শিরোনামের জন্য অনুমতি দিতে এক্সএমএল যুক্ত করেছে:

ব্যবহার অব্যাহত PreferenceActivity:

settings_toolbar.xml :

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.Toolbar
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/toolbar"
    app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:minHeight="?attr/actionBarSize"
    app:navigationContentDescription="@string/abc_action_bar_up_description"
    android:background="?attr/colorPrimary"
    app:navigationIcon="?attr/homeAsUpIndicator"
    app:title="@string/action_settings"
    />

SettingsActivity.java :

public class SettingsActivity extends PreferenceActivity {

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

        LinearLayout root = (LinearLayout)findViewById(android.R.id.list).getParent().getParent().getParent();
        Toolbar bar = (Toolbar) LayoutInflater.from(this).inflate(R.layout.settings_toolbar, root, false);
        root.addView(bar, 0); // insert at top
        bar.setNavigationOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                finish();
            }
        });
    }

}

Result :

উদাহরণ


আপডেট (জিনজারব্রেড সামঞ্জস্যতা):

হিসাবে নির্দিষ্ট এখানে , জিনজার ব্রেড ডিভাইস এই লাইনে নালপয়েন্টারএক্সেপশন ফিরে আছেন:

LinearLayout root = (LinearLayout)findViewById(android.R.id.list).getParent().getParent().getParent();

ফিক্স:

SettingsActivity.java :

public class SettingsActivity extends PreferenceActivity {

    @Override
    protected void onPostCreate(Bundle savedInstanceState) {
        super.onPostCreate(savedInstanceState);
        Toolbar bar;

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
            LinearLayout root = (LinearLayout) findViewById(android.R.id.list).getParent().getParent().getParent();
            bar = (Toolbar) LayoutInflater.from(this).inflate(R.layout.settings_toolbar, root, false);
            root.addView(bar, 0); // insert at top
        } else {
            ViewGroup root = (ViewGroup) findViewById(android.R.id.content);
            ListView content = (ListView) root.getChildAt(0);

            root.removeAllViews();

            bar = (Toolbar) LayoutInflater.from(this).inflate(R.layout.settings_toolbar, root, false);
            

            int height;
            TypedValue tv = new TypedValue();
            if (getTheme().resolveAttribute(R.attr.actionBarSize, tv, true)) {
                height = TypedValue.complexToDimensionPixelSize(tv.data, getResources().getDisplayMetrics());
            }else{
                height = bar.getHeight();
            }

            content.setPadding(0, height, 0, 0);

            root.addView(content);
            root.addView(bar);
        }

        bar.setNavigationOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                finish();
            }
        });
    }
}

উপরের কোন সমস্যা আমাকে জানাবেন!


আপডেট 2: টিঙ্কিং ওয়ার্কারাউন্ড

অনেক দেব নোটগুলিতে যেমন উল্লেখ করা হয়েছে PreferenceActivityতেমন উপাদানগুলির রঙিনকে সমর্থন করে না তবে কয়েকটি অভ্যন্তরীণ ক্লাস ব্যবহার করে আপনি এটি অর্জন করতে পারেন। এই ক্লাসগুলি অপসারণ না হওয়া অবধি। (অ্যাপকম্প্যাট সমর্থন-v7 v21.0.3 ব্যবহার করে কাজ করে)।

নিম্নলিখিত আমদানি যুক্ত করুন:

import android.support.v7.internal.widget.TintCheckBox;
import android.support.v7.internal.widget.TintCheckedTextView;
import android.support.v7.internal.widget.TintEditText;
import android.support.v7.internal.widget.TintRadioButton;
import android.support.v7.internal.widget.TintSpinner;

তারপরে onCreateViewপদ্ধতিটি ওভাররাইড করুন :

@Override
public View onCreateView(String name, Context context, AttributeSet attrs) {
    // Allow super to try and create a view first
    final View result = super.onCreateView(name, context, attrs);
    if (result != null) {
        return result;
    }

    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
        // If we're running pre-L, we need to 'inject' our tint aware Views in place of the
        // standard framework versions
        switch (name) {
            case "EditText":
                return new TintEditText(this, attrs);
            case "Spinner":
                return new TintSpinner(this, attrs);
            case "CheckBox":
                return new TintCheckBox(this, attrs);
            case "RadioButton":
                return new TintRadioButton(this, attrs);
            case "CheckedTextView":
                return new TintCheckedTextView(this, attrs);
        }
    }

    return null;
}

Result:

উদাহরণ 2


অ্যাপকম্প্যাট 22.1

অ্যাপকোম্প্যাট 22.1 নতুন রঙিন উপাদানগুলি প্রবর্তন করেছে যার অর্থ শেষ আপডেটের মতো একই প্রভাব অর্জনের জন্য অভ্যন্তরীণ ক্লাসগুলি ব্যবহার করার দরকার নেই। পরিবর্তে এটি অনুসরণ করুন (এখনও ওভাররাইডিং onCreateView):

@Override
public View onCreateView(String name, Context context, AttributeSet attrs) {
    // Allow super to try and create a view first
    final View result = super.onCreateView(name, context, attrs);
    if (result != null) {
        return result;
    }

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
        // If we're running pre-L, we need to 'inject' our tint aware Views in place of the
        // standard framework versions
        switch (name) {
            case "EditText":
                return new AppCompatEditText(this, attrs);
            case "Spinner":
                return new AppCompatSpinner(this, attrs);
            case "CheckBox":
                return new AppCompatCheckBox(this, attrs);
            case "RadioButton":
                return new AppCompatRadioButton(this, attrs);
            case "CheckedTextView":
                return new AppCompatCheckedTextView(this, attrs);
        }
    }

    return null;
}

প্রয়োজনীয় পছন্দসই স্ক্রিনগুলি

অনেক লোক নেস্টেড এরগুলিতে টুলবারটি অন্তর্ভুক্ত করে সমস্যাগুলি ভোগ করছে <PreferenceScreen />তবে আমি একটি সমাধান পেয়েছি !! - অনেক পরীক্ষার পরেও ত্রুটি!

আপনার সাথে নিম্নলিখিতগুলি যুক্ত করুন SettingsActivity:

@SuppressWarnings("deprecation")
@Override
public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
    super.onPreferenceTreeClick(preferenceScreen, preference);

    // If the user has clicked on a preference screen, set up the screen
    if (preference instanceof PreferenceScreen) {
        setUpNestedScreen((PreferenceScreen) preference);
    }

    return false;
}

public void setUpNestedScreen(PreferenceScreen preferenceScreen) {
    final Dialog dialog = preferenceScreen.getDialog();

    Toolbar bar;

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
        LinearLayout root = (LinearLayout) dialog.findViewById(android.R.id.list).getParent();
        bar = (Toolbar) LayoutInflater.from(this).inflate(R.layout.settings_toolbar, root, false);
        root.addView(bar, 0); // insert at top
    } else {
        ViewGroup root = (ViewGroup) dialog.findViewById(android.R.id.content);
        ListView content = (ListView) root.getChildAt(0);

        root.removeAllViews();

        bar = (Toolbar) LayoutInflater.from(this).inflate(R.layout.settings_toolbar, root, false);

        int height;
        TypedValue tv = new TypedValue();
        if (getTheme().resolveAttribute(R.attr.actionBarSize, tv, true)) {
            height = TypedValue.complexToDimensionPixelSize(tv.data, getResources().getDisplayMetrics());
        }else{
            height = bar.getHeight();
        }

        content.setPadding(0, height, 0, 0);

        root.addView(content);
        root.addView(bar);
    }

    bar.setTitle(preferenceScreen.getTitle());

    bar.setNavigationOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            dialog.dismiss();
        }
    });
}

PreferenceScreenজাতীয় ব্যথা হওয়ার কারণ হ'ল এগুলি একটি মোড়কের ডায়ালগ হিসাবে ভিত্তি করে রয়েছে, সুতরাং আমাদের এটির সাথে ডায়ালগ লেআউট ক্যাপচার করতে হবে।


সরঞ্জামদণ্ডের ছায়া

ডিজাইনটি আমদানি করে Toolbarপ্রি-ভি 21 ডিভাইসগুলিতে উচ্চতা বা ছায়া ছড়িয়ে দেওয়ার অনুমতি দেয় না, সুতরাং আপনি যদি নিজের উপর উচ্চতা রাখতে চান তবে আপনাকে Toolbarএটিতে একটি মোড়ানো দরকার AppBarLayout:

`সেটিংস_টলবার.এক্সএমএল:

<android.support.design.widget.AppBarLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

   <android.support.v7.widget.Toolbar
       .../>

</android.support.design.widget.AppBarLayout>

build.gradleফাইলে নির্ভরতা হিসাবে ডিজাইন সমর্থন লাইব্রেরি যুক্ত করতে ভুলবেন না :

compile 'com.android.support:support-v4:22.2.0'
compile 'com.android.support:appcompat-v7:22.2.0'
compile 'com.android.support:design:22.2.0'

অ্যান্ড্রয়েড 6.0

আমি উল্লিখিত ওভারল্যাপিং ইস্যুটি তদন্ত করেছি এবং আমি সমস্যাটি পুনরুত্পাদন করতে পারি না।

উপরোক্ত হিসাবে ব্যবহারের পূর্ণ কোড নিম্নলিখিতটি উত্পাদন করে:

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

যদি আমি কিছু মিস করছি তবে দয়া করে আমাকে এই রেপোর মাধ্যমে জানান এবং আমি তদন্ত করব।


চমৎকার একটি: আমি প্রথম পদ্ধতির ব্যবহার করেছি (জিনজারব্রেড আমার লক্ষ্য নয়)। ধন্যবাদ!
জেজে 86

এই উদাহরণটি ব্যবহার করে জিঞ্জারব্রেডে আপ বোতামটি নষ্ট হয়ে গেছে বলে মনে হয়।
idunnololz

4
আপনার দুর্দান্ত উত্তরের জন্য আপনাকে ধন্যবাদ, আমি আপনাকে কিছু দিন আগে গৃহীত রাষ্ট্র দিয়েছিলাম। এটি দুর্দান্ত দেখাবে কিনা তা নিশ্চিত করার জন্য আমি কেবল টিন্টিং অংশটি অনুলিপি করেছি :)
পুনরায় পুনর্বার রেকর্ড করুন

4
আমাকে নিজের সংশোধন করতে হবে android:themeকার্যসংক্রান্ত শুধুমাত্র Android 5.0+ জন্য সরঞ্জাম দণ্ডে কালো পাঠ্যের রঙ সংশোধন করা হয়েছে। এটি নতুন সমর্থন লাইব্রেরির সাথে কিছু পরিবর্তিত হয়েছে বলে মনে হচ্ছে (আমি 22.2.0 ব্যবহার করছি)।
টনি

4
অ্যান্ড্রয়েড.আর.আইডি.লিস্টের পিতামাতা অ্যান্ড্রয়েড এন
ফ্রেম লেআউট

45

ইস্যুটি সমাধান করতে অ্যাপকম্প্যাটএটিভিটি এবং পছন্দের ফ্রেম ব্যবহার করুন:

অ্যাপকম্প্যাটঅ্যাক্টিভিটি:

public class SettingsActivity extends AppCompatActivity {

@Override
protected void onPostCreate(Bundle savedInstanceState) {
    super.onPostCreate(savedInstanceState);
    getFragmentManager().beginTransaction().replace(android.R.id.content, new SettingsFragment()).commit();
}}

পছন্দ ফ্রেমমেন্ট:

public class SettingsFragment extends PreferenceFragment {

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

4
অ্যাকশনবার অ্যাক্টিভিটি হ্রাস করা হয়েছে।
rekire

@rekire তার android.support.v7.app.ActionBarActivity
আব্দুল্লাহ

4
অ্যাকশনবার অ্যাক্টিভিটির পরিবর্তে কেবল অ্যাপকম্প্যাটএটিভিটি প্রসারিত করুন।
স্যামিটি

4
আমার জন্য কাজ করেছেন, এবং উপরের চেয়ে অনেক সহজ।
অ্যারন ব্লেনকুশ

4
সাধারণ অগ্রাধিকার পর্দার জন্য, এটি বাস্তবায়নের সবচেয়ে সহজ সমাধান।
ক্রিস সাইরাফাইস

7

আমি এই সাধারণ কোডটি দিয়ে নিজেই টুলবারটি যুক্ত করে শেষ করেছি:

// get the root container of the preferences list
LinearLayout root = (LinearLayout)findViewById(android.R.id.list).getParent().getParent().getParent();
Toolbar bar = (Toolbar)LayoutInflater.from(this).inflate(R.layout.preferences_toolbar, root, false);
root.addView(bar, 0); // insert at top
bar.setNavigationOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        finish();
    }
});

এখানে আমার পছন্দসমূহ_টুলবার.এক্সএমএল:

<android.support.v7.widget.Toolbar
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_height="wrap_content"
    android:layout_width="match_parent"
    android:minHeight="?attr/actionBarSize"
    app:navigationContentDescription="@string/abc_action_bar_up_description"
    android:background="?attr/colorPrimary"
    app:navigationIcon="?attr/homeAsUpIndicator"
    app:theme="@style/Theme.Toolbar" />

আমার ধারণা আমি এটিকে
ক্রেট

6

"আপনার নিজের ঘূর্ণায়মান" অ্যাকশন বারের চেয়ে আরও ভাল সমাধান হ'ল অ্যাপকম্প্যাটডেলিগেট ক্লাসটি ব্যবহার করা , যা আপনাকে সমর্থন লাইব্রেরি থেকে একটি আসল- সত্যবাদী অ্যাকশন বার আনতে দেয়। এটি ব্যবহারের উদাহরণ কোড এখানে, ,ubom questionr Kučera এই প্রশ্নের উত্তর থেকে নেওয়া ।

...
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatDelegate;
import android.support.v7.widget.Toolbar;
...

public class SettingsActivity extends PreferenceActivity {

    private AppCompatDelegate mDelegate;

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

    @Override
    protected void onPostCreate(Bundle savedInstanceState) {
        super.onPostCreate(savedInstanceState);
        getDelegate().onPostCreate(savedInstanceState);
    }

    public ActionBar getSupportActionBar() {
        return getDelegate().getSupportActionBar();
    }

    public void setSupportActionBar(@Nullable Toolbar toolbar) {
        getDelegate().setSupportActionBar(toolbar);
    }

    @Override
    public MenuInflater getMenuInflater() {
        return getDelegate().getMenuInflater();
    }

    @Override
    public void setContentView(@LayoutRes int layoutResID) {
        getDelegate().setContentView(layoutResID);
    }

    @Override
    public void setContentView(View view) {
        getDelegate().setContentView(view);
    }

    @Override
    public void setContentView(View view, ViewGroup.LayoutParams params) {
        getDelegate().setContentView(view, params);
    }

    @Override
    public void addContentView(View view, ViewGroup.LayoutParams params) {
        getDelegate().addContentView(view, params);
    }

    @Override
    protected void onPostResume() {
        super.onPostResume();
        getDelegate().onPostResume();
    }

    @Override
    protected void onTitleChanged(CharSequence title, int color) {
        super.onTitleChanged(title, color);
        getDelegate().setTitle(title);
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        getDelegate().onConfigurationChanged(newConfig);
    }

    @Override
    protected void onStop() {
        super.onStop();
        getDelegate().onStop();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        getDelegate().onDestroy();
    }

    public void invalidateOptionsMenu() {
        getDelegate().invalidateOptionsMenu();
    }

    private AppCompatDelegate getDelegate() {
        if (mDelegate == null) {
            mDelegate = AppCompatDelegate.create(this, null);
        }
        return mDelegate;
    }
}


3

হাই যদি আমি এখনও আপনার এই সমস্যা থাকে না। তবে আমি বুঝতে পারি যে এটি সমাধান করার জন্য আমি যা করেছি তা পোস্ট করব এবং আশা করি এটি কারও সাহায্য করবে।

1) প্রথমে, আপনি লক্ষ্য করেছেন যে পছন্দের কার্যকলাপটি তালিকা থেকে ক্রিয়াকলাপ প্রসারিত করে যা ক্রিয়াকলাপ থেকে প্রসারিত হয়।

বিকাশকারীদের ব্লগের মন্তব্য অনুসারে ( http://android-developers.blogspot.com/2014/10/appcompat-v21-matory-design-for-pre.html ), ভি 21 ব্যবহার করতে আপনার সমস্ত ক্রিয়াকলাপ অবশ্যই অ্যাকশনবার্টিভিটি থেকে উত্তরাধিকারী হতে হবে । সুতরাং আপনার সমস্যা আছে।

2) সমাধানের জন্য আমি যে পদক্ষেপগুলি ব্যবহার করেছি তা হ'ল:

a) Make sure that you set the Theme of your PreferenceActivity to inherits one ot the Theme.AppCompat Themes.

b) Make your class PreferenceActivity extends ActionBarActivity.

c) Use the PreferenceFragment as your container for all your preferences.

এটি সমাধান করা উচিত।

চিয়ার্স!


4
"আপনার শ্রেণিটিকে অগ্রাধিকার দিন কার্যকলাপ ক্রিয়াকলাপটি অ্যাকশনবার্টিভিটি বাড়ায়" - তবে কীভাবে?
vbence

এই লিঙ্কটি এখানে দেখুন: কোড. hootsuite.com/…
আফ্রিক অ্যান্ড্রয়েড

4
ধন্যবাদ, আমি মনে করি এটি যতটা সম্ভব কাছাকাছি চলে আসে। আসল ব্যথা হ'ল লোডহাইডার্সফ্রোম রিসোর্সের মাধ্যমে পছন্দসইটিভিটি বিল্ট-ইন নেভিগেশন রয়েছে , খণ্ডগুলি সহ আপনাকে নিজেই নেভিগেশন তৈরি করতে হবে।
vbence

0

আমি স্বীকৃত প্রশ্নের অনুরূপ কিছু করেছি, তবে আমি আমার লেআউটটি অন্যান্য ক্রিয়াকলাপগুলিতেও ( MainActivityখুব) ব্যবহার করছি , সুতরাং আমি এটিতে একটি তীরকে হার্ড-কোড করতে পারি না।

আমার জন্য কী কাজ করেছে:

private void setupActionBar() {
    LinearLayout root = (LinearLayout)findViewById(android.R.id.list).getParent().getParent().getParent();
    Toolbar toolbar = (Toolbar)LayoutInflater.from(this).inflate(R.layout.app_bar, root, false);
    root.addView(toolbar, 0);
    setSupportActionBar(toolbar);
    ActionBar ab = getSupportActionBar();
    ab.setDisplayHomeAsUpEnabled(true);
}

0

আমারো একই ইস্যু ছিল. ক্রিয়াকলাপের থিমটিকে যে কোনও অ্যাকশনবার রয়েছে তার মধ্যে এটি পরিবর্তন করার চেষ্টা করুন। সেটিংসএকটিভিটির ক্রিয়াকলাপ ট্যাগটিতে নিম্নলিখিত লাইনটি যুক্ত করা আমার জন্য কাজ করেছিল:

android:theme="Theme.AppCompat.DayNight.DarkActionBar"


-1

একটি সহজ উপায় যা আমি বুঝতে পেরেছি তা ওভাররাইড হচ্ছে:

@android:style/Theme.Material.Light.DarkActionBar

আপনার স্টাইলে:

<style name="SettingsTheme" parent="@android:style/Theme.Material.Light.DarkActionBar">
    <item name="android:colorPrimary">@color/sunshine_blue</item>
    <item name="android:colorPrimaryDark">@color/sunshine_dark_blue</item>
</style>
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.